FileSystemWatcherMonitoring

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    FileSystemWatcherMonitoring

    Hi

    Ich erstelle gerade ein Monitoring mit FileSystemWatcher

    Funktioniert auch grundsätzlich.

    Nur beim Event Changed hängt sich mein Programm auf. Hab es jetzt erstmal auskommentiert.
    Hier mal der Code

    VB.NET-Quellcode

    1. 'Private Sub Fsw1_Changed(sender As Object, e As FileSystemEventArgs) Handles fsw1.Changed
    2. 'ListBox4.Items.Add("Datei- " & e.FullPath.ToString & " geändert am: " & System.DateTime.Now)
    3. 'TextBox7.Text = ListBox4.Items.Count
    4. 'ListBox4.Refresh()
    5. 'Dim text As String = ""
    6. 'For Each Litem As String In ListBox4.Items
    7. 'text &= vbCrLf & Litem
    8. 'Next
    9. 'IO.File.WriteAllText(".\Datei_geändert.log", text)
    10. 'End Sub
    Puh! Zum Glück hast Du den Code auskommentiert, sonst hätte er im Forum bösen Schaden angerichtet :P . Spaß am Sonntagmorgen.
    Bei mir funktioniert Dein Code. Allerdings wär es gut zu wissen, wo er hängen bleibt.

    Spekulatius: Wenn das Verzeichnis überwacht wird, in dem auch Dein Programm ist, wird's wohl folgende Endlosschleife:
    1. es hat sich ne Datei im Verzeichnis geändert (irgendeine)
    2. fsw1.Changed wird aufgerufen
    3. die geänderte Datei wird in Datei_geändert.log geschrieben
    4. es hat sich ne Datei (jetzt eben Datei_geändert.log) im Verzeichnis geändert -> weiter mit Punkt 2
    Lass Dir mal per Debug.Print einmal die Anzahl der Fsw1_Changed-Aufrufe und gleich dazu noch e.FullPath geben.

    btw: TextBox7.Text = ListBox4.Items.Count und ..." geändert am: " & System.DateTime.Now) sind Option Strict Off und e.FullPath.ToString redundant, da FullPath bereits nen String zurückliefert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    Vielleicht hätte ich noch erwähnen sollen, dass ich nicht nur obiges verwende sondern auch

    Fsw1_Created
    Fsw1_Deleted
    und Fsw1_Renamed

    überwacht hatte ich mal zum Test das komplette c:\ Verzeichnis mit Unterverzeichnisse mit *.txt
    hier mal auch die Ansicht meiner Form
    Bilder
    • FormMonitoring.jpg

      52,07 kB, 708×554, 153 mal angesehen
    Diese Infos helfen m.E. insofern nicht weiter, da Du geschrieben hast, ein Problem mit dem fw1.Changed-EventHandler zu haben. Geh doch mal meinen Post#2-Tipp durch, v.a. mit dem Debug.Print und sieh, was passiert. Hab ich Dich richtig verstanden, dass in diesem Eventhandler, den Du in Post#1 gezeigt hast, etwas zu passieren scheint, was Dein ganzes Programm aufhängt/unansprechbar macht? Wenn ja, dann dürfte es sich - wie beschrieben - immer wieder selbst aufrufen und nach spekulatiusierten 10 Minuten einen StackOverflow geben, da fw1.Changed geschätzte 1439842mal aufgerufen wurde.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    manni4545 schrieb:

    Nur beim Event Changed hängt sich mein Programm auf.
    Ich sehe hier einen thread-übergreifenden Vorgang.
    Nö, isses nicht. Bei mir läuft dieser Code einwandfrei.
    Pack den Code mal in ein neues Projekt und teste selbst.
    Dann machst Du testweise um diesen Code einen Try/Catch-Block und siehst Dir an und postest, was in der Exception steht
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi
    ich glaube das problem gefunden zu haben aus meinem Post 1
    es lag daran

    VB.NET-Quellcode

    1. IO.File.WriteAllText(".\Datei_geändert.log", text)


    ich habe mal den Code auskommentiert und siehe jetzt funktioniert es.
    Da er ja immer bei einer änderung in die Datei_geändert.log schrieb war es wie eine schleife und hat sich dann aufgehängt.
    Ich benutze jetzt einen SaveFileDialog um die Logs zu schreiben
    Seriously? Das ist ja mal n krasser Fehler, da wär ich ja nie draufgekomm... ach Moment. Das war ja genau das, was ich in Post#2 geschrieben hatte :|
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hab noch eine Frage.

    ich möchte gerne durch eine CheckBox Fsw1_Changed aktivieren Post1

    So geht es aber nicht.

    VB.NET-Quellcode

    1. Private Sub cb_Changed_CheckedChanged(sender As Object, e As EventArgs) Handles cb_Changed.CheckedChanged
    2. If cb_Changed.Checked Then
    3. Fsw1_Changed = True
    4. Else
    5. Fsw1_Changed = False
    6. End If


    Komme jetzt einfach nicht dahinter wo ich einen Denkfehler mache
    Es sollen noch 3 weitere checkboxen dazu kommen mit Fsw1_Created, Fsw1_Deleted und Fsw1_Renamed
    In der Hoffnung, dass Du diesmal die Antworten liest:
    Private Sub Fsw1_Changed(sender As Object, e As FileSystemEventArgs) Handles fsw1.Changed

    VB.NET-Quellcode

    1. If cb_Changed.Checked Then
    2. AddHandler fw1.Changed, AddressOf Fsw1_Changed
    3. Else
    4. RemoveHandler fw1.Changed, AddressOf Fsw1_Changed
    5. End If

    Klar soweit? Fixen EventHandler aus dem Prozedurkopf rausnehmen und bei Bedarf EventHandler zuschalten bzw. wieder abmelden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Zeig mal bitte Deinen aktuellen Prozedurkopf von Private Sub Fsw1_Changed (also das, was in jener Zeile noch bei Dir steht) und den relevanten Code von Private Sub cb_Changed_CheckedChanged
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    Ich hoffe du meinst das...

    VB.NET-Quellcode

    1. Private Sub Fsw1_Changed(sender As Object, e As FileSystemEventArgs) Handles fsw1.Changed
    2. ListBox4.Items.Add("Datei- " & e.FullPath.ToString & " geändert am: " & System.DateTime.Now)
    3. TextBox7.Text = ListBox4.Items.Count
    4. ListBox4.Refresh()
    5. Dim text As String = ""
    6. For Each Litem As String In ListBox4.Items
    7. text &= vbCrLf & Litem
    8. Next
    9. 'IO.File.WriteAllText(".\Datei_geändert.log", text)
    10. End Sub


    und

    VB.NET-Quellcode

    1. Private Sub cb_Changed_CheckedChanged(sender As Object, e As EventArgs) Handles cb_Changed.CheckedChanged
    2. If cb_Changed.Checked Then
    3. AddHandler fsw1.Changed, AddressOf Fsw1_Changed
    4. Else
    5. RemoveHandler fsw1.Changed, AddressOf Fsw1_Changed
    6. End If
    7. End Sub
    Jaaa. Und wie ich Post#9 geschrieben habe: das Handles fsw1.Changed in der Zeile von Private Sub Fsw1_Changed muss weg. Denn das ist Dein fixer EventHandler. Du willst keinen fixen EventHandler, sondern einen flexiblen, wie in cb_Changed_CheckedChanged nun eingebaut. Lösch den Teil Handles fsw1.Changed raus und fertig.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hab noch ne Frage zur Progressbar damit kenne ich mich noch nicht so aus.

    In Post 3 sieht man ein Bild von meinem Programm.

    Dort möchte ich eine Progressbar einbauen.

    Beim drücken auf den Button "Überwachung starten" soll die Progressbar loslegen und so lange laufen
    bis ich auf den Button "Überwachung stopen" klicke.
    Könnt ihr mir da auf die Sprünge helfen
    Häh? Ein(e?) Progressbar ist zum Anzeigen eines Fortschritts (= Progress) da. Deine Überwachung ist doch grundsätzlich eine Endlosschleife, wie soll da ein messbarer und somit darstellbarer Fortschritt erzielt werden? Oder fehlt da was an Info? Was soll einen Anfang und ein messbares Ende und einen messbaren Fortschritt in Deinem Programm haben?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hi
    z.B. ein Button, auf dem "Aktivieren" oder "Deaktivieren" wechselweise steht. Oder eine PictureBox, die entsprechend ein rotes oder grünes Bild zeigt. Das kannst du btw. auch per Paint-Ereignis zeichnen. Falls du "Fortschritt" suggerieren willst, nimm dir das mit der PictureBox und rotiere im Paint-Ereignis, bevor du zeichnest, das Graphics-Objekt, indem du entsprechend die RotateTransform-Methode aufrufst, bevor du zeichnest. Besser noch: Erbe von Control, füge einen Timer hinzu und invalidiere das Steuerelement in dessen Tick-Ereignis. Zeichnen kannst du in OnPaint, das du dann überschreiben musst.
    Wenn du das mit deiner ProgressBar lösen willst, stelle ihren Stil auf Marquee. Das ist allerdings meiner Meinung nach nicht intuitiv.

    Viele Grüße
    ~blaze~
    @manni4545

    manni4545 schrieb:

    es lag daran

    Visual Basic-Quellcode

    1. IO.File.WriteAllText(".\Datei_geändert.log", text)



    damit hatte ich auch mal zu kämpfen.
    In C# ist es so, dass das Event vom FileSystemWatcher bei Dateiänderungen zweimal ausgelöst wird.
    Unter Umständen kommen die Events sehr schnell nacheinander, sodass das Schreiben in die Datei noch nicht abgeschlossen ist.

    Mir hat geholfen den Teil mit dem Schreiben in die Datei zu Locken
    Hier mal ein Link zu einem Beispiel
    stackoverflow.com/a/915877

    Gruss

    mikeb69

    manni4545 schrieb:

    Nur als optische erweiterung.
    Gib der ProgressBar den Style Marquee und sieh Dir auch die Property .MarqueeAnimationSpeed an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!