none
Probleme mit dem Filesystemwatcher beim löschen von Dateien, wenn das Verzeichnis gelöscht wird RRS feed

  • Frage

  • Hallo,

     

    ich habe ein Problem mit dem FSW. Er ist so eingestellt, das er nach *.jpg filtert. Füge ich Dateien hinzu oder lösche sie, wird auch ein Event ausgelöst. Wenn ich aber ein ganzes Verzeichnis lösche, in dem *.jpg Dateien liegen wird der Event nicht ausgelöst.

    Als Test habe ich den Filter auf alles gesetzt, und bekomme nun einen Event, das das Verzeichnis gelöscht wird. M.E. ist hier ein großer Fehler, da ja auch die Dateien in dem Verzeichnis mit gelöscht werden, oder gibt es eine Einstellung, die geändert werden muß?

     

     

    Mittwoch, 22. September 2010 12:53

Antworten

  • Mir ist nur nicht klar, warum beim löschen des Verzeichnisses kein Event für die enthaltenen Dateieien kommt, da diese ja ebenfalls gelöscht werden. Wenn man nicht weiß, welche Dateien vorher enthalten waren, ist das sehr inkosistent.

    dies ist vermutlich eben wie gesagt eine der Einschränkung von _Win32_ ReadDirectoryChangesW  (bitte danach googeln, ist _kein_ .NET oder VB Thema mehr!).

    Generell darf man die Events nur als 'informative' Benachrichtigung (notification) sehen, etwa für ein absolut exaktes Journal taugt dies kaum  (dazu gäbe es zB ein aufwändigeres, Low-Level NTFS USN journal, nicht in .NET).

    Des weiteren gibt es diverse Timing- + Speicherlimiten, sie auch:
    http://msdn.microsoft.com/de-de/library/system.io.filesystemwatcher.internalbuffersize.aspx
    Donnerstag, 23. September 2010 07:45
  • Hallo,

    ich habe ein Problem mit dem FSW. Er ist so eingestellt, das er
    nach *.jpg filtert.

    Wie sind

            FSW.Path
            FSW.Filter
            FSW.IncludeSubdirectories
            FSW.NotifyFilter

    eingestellt?

    Füge ich Dateien hinzu oder lösche sie, wird auch ein
    Event ausgelöst. Wenn ich aber ein ganzes Verzeichnis
    lösche, in dem *.jpg Dateien liegen wird der Event nicht
    ausgelöst.

    Wenn Path auf eine konkrete Datei wie z.B.
    "C:\Verzeichnis\Datei.txt" oder auf eine Dateiendung wie
    "*.jpg" eingestellt ist, sollte sich das Verzeichnis gar nicht
    löschen lassen.

    Als Test habe ich den Filter auf alles gesetzt,

    Wie sieht dieser Filter konkret aus?

        FSW.Filter = ....

    und bekomme nun einen Event, das das Verzeichnis gelöscht
    wird. M.E. ist hier ein großer Fehler, da ja auch die Dateien
    in dem Verzeichnis mit gelöscht werden, oder gibt es eine
    Einstellung, die geändert werden muß?

    Beim Löschen eines Verzeichnisses wird tatsächlich nur
    für dieses ein Ereignis ausgelöst, nicht für die darin enthaltenen
    Dateien.

    Mit dem Beispiel unter

        www.gssg.de -> Visual Basic -> VB.net
            -> System / Netzwerk
                -> File System Watcher

    kannst Du alle erdenklichen Einstellungen testen.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)




    Donnerstag, 23. September 2010 08:10

Alle Antworten

  • Hallo MH

    prüfe:
    FileSystemWatcher.NotifyFilter
    http://msdn.microsoft.com/de-de/library/system.io.filesystemwatcher.notifyfilter.aspx

    ob dort DirectoryName gesetzt ist:
    http://msdn.microsoft.com/de-de/library/system.io.notifyfilters.aspx

    wobei dies dann möglicherweise einen (ggf zusätzlichen/separaten) FSW auf dem _übergeordneten_ Verzeichnis erfordern könnte.

    Intern nutzt .NET Win32 ReadDirectoryChangesW:
    http://msdn.microsoft.com/en-us/library/aa365465(VS.85).aspx

    und hat somit auch alle dessen Randbedingungen und (mind.) Einschränkungen/Probleme,
    musst du also ggf auf Win32 (oder NTFS) -Ebene nachforschen (ist kein .NET Thema mehr)

    Mittwoch, 22. September 2010 19:13
  • Hallo,

     

    die Notify Filter stimmen m.E. soweit. FileName,DirectoryName, LastWrite, LastAccess.

    Einzelne Löschevents werden mir ja auch berichtet. Auch das löschen des Verzeichnisses kann ich abfragen.
    Mir ist nur nicht klar, warum beim löschen des Verzeichnisses kein Event für die enthaltenen Dateieien kommt,
    da diese ja ebenfalls gelöscht werden. Wenn man nicht weiß, welche Dateien vorher enthalten waren, ist das sehr inkosistent.

    Ich vermute hier eher eine Schwäche des Filesystemwatchers. Aber da lasse ich mich gerne eines bessereh belehren.

    btw: Wieso sollte eigentlich der DirectoryName im NotifyFilter wichtig sein, wenn ich die Events der Dateien haben will?

     

    Viele Grüße,

    Michael

    Donnerstag, 23. September 2010 06:06
  • Mir ist nur nicht klar, warum beim löschen des Verzeichnisses kein Event für die enthaltenen Dateieien kommt, da diese ja ebenfalls gelöscht werden. Wenn man nicht weiß, welche Dateien vorher enthalten waren, ist das sehr inkosistent.

    dies ist vermutlich eben wie gesagt eine der Einschränkung von _Win32_ ReadDirectoryChangesW  (bitte danach googeln, ist _kein_ .NET oder VB Thema mehr!).

    Generell darf man die Events nur als 'informative' Benachrichtigung (notification) sehen, etwa für ein absolut exaktes Journal taugt dies kaum  (dazu gäbe es zB ein aufwändigeres, Low-Level NTFS USN journal, nicht in .NET).

    Des weiteren gibt es diverse Timing- + Speicherlimiten, sie auch:
    http://msdn.microsoft.com/de-de/library/system.io.filesystemwatcher.internalbuffersize.aspx
    Donnerstag, 23. September 2010 07:45
  • Hallo,

    ich habe ein Problem mit dem FSW. Er ist so eingestellt, das er
    nach *.jpg filtert.

    Wie sind

            FSW.Path
            FSW.Filter
            FSW.IncludeSubdirectories
            FSW.NotifyFilter

    eingestellt?

    Füge ich Dateien hinzu oder lösche sie, wird auch ein
    Event ausgelöst. Wenn ich aber ein ganzes Verzeichnis
    lösche, in dem *.jpg Dateien liegen wird der Event nicht
    ausgelöst.

    Wenn Path auf eine konkrete Datei wie z.B.
    "C:\Verzeichnis\Datei.txt" oder auf eine Dateiendung wie
    "*.jpg" eingestellt ist, sollte sich das Verzeichnis gar nicht
    löschen lassen.

    Als Test habe ich den Filter auf alles gesetzt,

    Wie sieht dieser Filter konkret aus?

        FSW.Filter = ....

    und bekomme nun einen Event, das das Verzeichnis gelöscht
    wird. M.E. ist hier ein großer Fehler, da ja auch die Dateien
    in dem Verzeichnis mit gelöscht werden, oder gibt es eine
    Einstellung, die geändert werden muß?

    Beim Löschen eines Verzeichnisses wird tatsächlich nur
    für dieses ein Ereignis ausgelöst, nicht für die darin enthaltenen
    Dateien.

    Mit dem Beispiel unter

        www.gssg.de -> Visual Basic -> VB.net
            -> System / Netzwerk
                -> File System Watcher

    kannst Du alle erdenklichen Einstellungen testen.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)




    Donnerstag, 23. September 2010 08:10