Anzeige

Datei aktualisieren?


#1
Hallo Forum,

ich suche verzeifelt nach einer möglichen Lösung.

Folgendes:
Mein Server erzeugt eine txt Datei und schreibt in dieser zeilenweise Datensätze hinein.
Auf der Gegenseite versucht der Client, während der Server weiter die Zeilen hinzufügt, den Inhalt der Datei auszulesen.

Wenn ich nun den Inhalt der Datei auslese klappt das auch wunderbar und ich erhalte die bis dahin eingefügten Datensätze (z.B. 100 Stück).
Möchte ich nun die nach dem ersten auslesen der Datei neu hinzugekommenen Datensätze auslesen, so erhalte ich jeweils immer nur die gleichen 100 Datensätze wie zuvor.

Ich habe bereits versucht die Datei zu schließen und neu einzulesen, doch leider bekomme ich lediglich die alten Datensätze ohne die neuen.

Auch habe ich versucht, den Stream offen zu lassen und dann einfach weiter zu lesen. Leider auch erfolglos.

Gibt es irgend eine Art/Methode das EndOfFile Attribut zu aktualisieren oder vielleicht ein ganzes Verzeichnis/Ordner zu aktualisieren, damit mein Programm erkennt, das sich an der Datei was geändert hat.

Ich habe bereits auch verschiedene Streams versucht, bringt alles nichts!

Hier der Code:

Code:
Imports System
Imports System.IO
Imports System.Text
Imports System.Threading
Imports Communication

Module Module1

    Sub Main()

        Dim path As String                       'Verzeichnis
        Dim count As Double                      'Anzahl der eingelesenen Zeichen

        path = "T:\dataset.csv"
        count = 0
        con = New InterfaceClass

        Try

            '*** Warten bis die Datei erzeugt wurde
            While Not System.IO.File.Exists(path)
            End While

            leseBlock(count, path)

            leseBlock(count, path)
           

        Catch ex As Exception

            MsgBox(ex.ToString)

        End Try

    End Sub



    Private Sub leseBlock(ByRef count As Double, ByVal path As String)

        Dim sr As StreamReader
        Dim tmp As String

        Debug.Print("leseBlock: " & count)

        Try
            tmp = Nothing

            sr = New StreamReader(path)
            sr.BaseStream.Position = count   'Lesezeiger setzen
            tmp = sr.ReadToEnd()             'Block lesen einlesen
            count = sr.BaseStream.Position - 2
            Console.WriteLine(tmp)
            sr.Close()

        Catch ex As Exception

            MsgBox(ex.ToString)

        End Try

    End Sub

End Module
 

NRFi

Erfahrenes Mitglied
#2
Hi,

es ist also So, dass der Client über das FileSystem auf die vom Server erzeugte Datei zugreift? Macht das Sinn?
Wie wärs, wenn der Server dem Client auf Wunsch die Daten der Datei zukommen lässt? Dafür brauch dieser wahrscheinlich gar nicht mal die Datei immer wieder neu lesen sondern kann sicher aus einer internen Variable darauf zugreifen, oder? :)

Aber mal zu deiner Frage:

Versuch mal, nachdem der Server was neues in die Datei geschrieben hat, die Methode Flush() auf dem Stream auszuführen. Diese dürfte es da geben. Danach schließt du den Stream und guckst nochmal nach ob der Client alles lesen kann. :suspekt:

Ansonsten guck mal nach der Klasse FileWatcher. Die liegt evtl. im System.IO Namespace oder :google: . Da findest du dann sicher auch wie das funktioniert. (FileWatcher kann Dateien überwachen und gibt dir dann per Event oder Callback bescheid, ob was verändert wurde). Damit kannst du deinen Client ausstatten und der sieht dann immer, wenn was verändert wird und holt sich die Daten. (wenn du das halt wirklich über diesen Weg machen willst).

gruß, NRF

PS: Du arbeitest doch mit VB.NET, was arbeitest du dann mit Modulen? :) :) :)
 
#3
Hallo NRFi,

wie würde das denn gehen, wenn der Server dem Client per Variable übergibt?
Mein Problem ist, das ich den Server über ein Remote Procedure Call nur aufrufen kann.

Das mit dem Flush muß ich mal versuchen. HAbe bereits mal versucht den Strem mit Discard zu leeren, war aber auch nichts.
Der FileWatcher hört sich gut an, werde gelich mal testet.

Zu den Modulen:
Um mein Problem zu lösen habe ich von .Net eine Consolenanwendung automatisch generieren lassen. Daher kommt das Modul. Wenn ich mein Problem beseitigt habe werde ich mit Klassen arbeite. Aber danke für den Hinweis und danke für die Ratschläge.
 

NRFi

Erfahrenes Mitglied
#4
aso, du arbeitest mit rpc.

naja gut wie auch immer, war ja nur ne idee.

Ja, das mit dem FileWatcher dürfte da wirklich helfen.

Das mit flush eigentlich nicht, da ja scheinbar die Daten in die Datei geschrieben werden, oder nicht? Ansonsten ist da flush halt besser angebracht als discard.

viel glück noch ;)
 
#5
Hallo ich habe ein sehr ähnliches Problem:

ein server schreibt eine log datei.
ich habe ein programm geschrieben das via filewatcher schaut ob sich etwas geändert hat.
wenn dies der fall ist lsit er die datei ein und gibt mir die neue zeite zurück.
klappt auch wunderbar... jedenfalls beim ersten durchlauf.. beim zweiten sagt er das die datei von einem anderen prozess genutzt wird.
Lese ich die Datei aber manuell über einen button ein (auch mehrfach) ist es kein problem... was mache ich falsch hier der code:

Private Sub DateiGeaendert(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) Handles FileWatcher.Changed
If e.FullPath = InputPfad Then

' Try
Dim Zeile As String
Dim myStreamReader As IO.StreamReader

SyncLock Me
myStreamReader = IO.File.OpenText(InputPfad)
Zeile = ""
While myStreamReader.Peek <> -1
Zeile = myStreamReader.ReadLine
End While
myStreamReader.Close()
myStreamReader.Dispose()
myStreamReader = Nothing
End SyncLock


MeldungAufteilen(Zeile)
' Catch ex As Exception
' MsgBox(ex.Message, MsgBoxStyle.Exclamation)
' End Try

End If
End Sub

der fehler entsteht dann beim zweiten oder dritten durchlauf schon beim versuch die datei zu öffnen... wäre toll wenn da einer eine lösung weiß
 
#6
Hi

Zuerst 2 Dinge:
1. Halte dich bitte an die Netiquette!
2. Wenn du Quellcode postest, setze ihn bitte in die entsprechenden Tags. Das macht die Angelegenheit lesbarer :)

zum Problem
Hast du schon mal geprüft, ob noch ein Durchlauf dieser Funktion noch läuft, während das Event erneut geworfen wird?
Ggf. musst du vielleicht auch das Auslösen der Events für den Durchlauf der Funktion kurzzeitig unterbinden. (EnableRaisingEvents = false).
Deine Code ist auch etwas umständlich und langsam, da du alle Zeilen bis auf die letzte ignorierst. Probier doch mal http://msdn.microsoft.com/en-us/library/s2tte0y1.aspx
Vom erhalten Array nimmst du dann das letzte Element
 
#7
das unterbinden habe ich vor dem lesen aus der datei unterbunden und danach wieder aktiviert und es ändert nichts....
langsamkeit wird erst nach der funktion verbessert ;) also deinen tipp in allen ehren aber das habe ich probiert und es hilft nix... vll kann den code ja mal wer testen ist ja quasi alles drin was man so braucht ;)

jemand noch eine idee?
 
#8
Hallo also das erste Problem ist gelösst:
wenn man in Notepad Speichert lösst er gleich zwei mal ein chance ereignis aus... das soll mal wer wissen...
aber ich denke da sproblem wird sich wiederholen wenn der server manchmal zu schnell ist und oft schreibt....
also wäre eine lösung des problems nicht schlecht
 
Anzeige
Anzeige