tutorials.de Buch-Aktion 02/2012
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
1831
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Peter Parker
    Peter Parker Peter Parker ist offline Mitglied Bronze
    Registriert seit
    Apr 2005
    Beiträge
    36
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    
    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
     

  2. #2
    NRFi NRFi ist offline Mitglied Brokat
    Registriert seit
    Jul 2003
    Ort
    Behind the mouse
    Beiträge
    321
    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.

    Ansonsten guck mal nach der Klasse FileWatcher. Die liegt evtl. im System.IO Namespace oder . 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?
     
    Für einen ist es Windows, für den anderen die größte Batch-Datei der Welt...

  3. #3
    Avatar von Peter Parker
    Peter Parker Peter Parker ist offline Mitglied Bronze
    Registriert seit
    Apr 2005
    Beiträge
    36
    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.
     

  4. #4
    NRFi NRFi ist offline Mitglied Brokat
    Registriert seit
    Jul 2003
    Ort
    Behind the mouse
    Beiträge
    321
    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
     
    Für einen ist es Windows, für den anderen die größte Batch-Datei der Welt...

  5. #5
    mutabor mutabor ist offline Grünschnabel
    Registriert seit
    Jun 2007
    Beiträge
    3
    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. #6
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.883
    Blog-Einträge
    34
    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
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  7. #7
    mutabor mutabor ist offline Grünschnabel
    Registriert seit
    Jun 2007
    Beiträge
    3
    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. #8
    mutabor mutabor ist offline Grünschnabel
    Registriert seit
    Jun 2007
    Beiträge
    3
    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
     

Ähnliche Themen

  1. Aktualisieren einer Datei in ZIP-Archiv
    Von mmonshausen im Forum Java
    Antworten: 2
    Letzter Beitrag: 16.10.08, 10:49
  2. XML Datei einlesen und aktualisieren
    Von Stiff im Forum Flash Plattform
    Antworten: 11
    Letzter Beitrag: 12.07.07, 13:09
  3. .properties Datei aktualisieren
    Von AndieDuframe im Forum Java
    Antworten: 8
    Letzter Beitrag: 07.05.07, 16:15
  4. label aktualisieren - nach datei
    Von GRU_EGO im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 11.01.07, 19:04
  5. Datei einbinden und ständig aktualisieren
    Von metno im Forum Javascript & Ajax
    Antworten: 4
    Letzter Beitrag: 26.10.06, 18:41