FilesystemWatcher

    • VB.NET

      FilesystemWatcher

      Fast überall bekommt man FilesystemWatcher-Code zu Gesicht, der sich mit dem Problem rumärgert, dass die FSW-Events im Nebenthread feuern.
      Das muss nicht sein, denn wenn man der FSW.SynchronizingObject-Property ein gültiges Control zuweist, dann "synchronisiert" er sich damit, d.h.: feuert seine Events in genau dem Thread, von dem dieses Controls erstellt wurde.
      Da alle Controls im selben Thread erstellt werden (geht kaum anders), treten nun keinerlei Threading-Probleme mehr auf.

      Aber es geht sogar noch einfacher: Man ziehe einfach einen FSW aus der Toolbox aufs Form.
      So ist der FSW bereits von vornherein im Gui integriert und synchronisiert.

      Im Download hab ich als Bonus auch noch ein PropertyGrid aufs Form gezogen, und dessen SelectedObject auf den FilesystemWatcher eingestellt - nun kann man sogar zur Laufzeit Änderungen am FSW vornehmen und deren Auswirkungen beobachten.


      Hier noch der Code:

      VB.NET-Quellcode

      1. Imports System.IO
      2. Public Class frmFileSystemWatcherTest
      3. Public Sub New()
      4. InitializeComponent()
      5. 'FileSystemWatcher1.SynchronizingObject = Me 'Braucht nicht extra zugewiesen werden, da der Watcher Designer-generiert ist
      6. 'FileSystemWatcher1.SynchronizingObject = Nothing 'testweise das Threading-Problem wieder heraufbeschwören
      7. FileSystemWatcher1.Path = Path.GetFullPath("..\..\..")
      8. End Sub
      9. Private Sub FileSystemWatcher1_Changed(sender As Object, e As IO.FileSystemEventArgs) Handles FileSystemWatcher1.Changed, FileSystemWatcher1.Created, FileSystemWatcher1.Deleted, FileSystemWatcher1.Renamed
      10. FileSystemEventArgsBindingSource.Add(e)
      11. End Sub
      12. End Class
      Also .Changed, .Created, .Deleted, .Renamed - alles wird gleichermassen behandelt, indem einfach das EventArgs der BindingSource zugefügt wird - wodurch es im DataGridView zur Anzeige kommt.

      Zu beachten ist auch, dass die e.Name-Property nicht zwangsläufig einen Dateinamen bezeichnet - es kann auch ein Ordner sein, oder sogar ein relativer Pfad (relativ zum überwachten Pfad), wenn das Ereignis ein Objekt in einem Unterordner betrifft.
      Dateien

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