Benutzer mit den meisten Antworten
Probleme mit dem Filesystemwatcher beim löschen von Dateien, wenn das Verzeichnis gelöscht wird

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ß?
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- Als Antwort vorgeschlagen Robert BreitenhoferModerator Montag, 27. September 2010 09:53
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 5. Oktober 2010 11:58
-
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.NotifyFiltereingestellt?
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 Watcherkannst Du alle erdenklichen Einstellungen testen.
Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Montag, 27. September 2010 09:53
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 5. Oktober 2010 11:59
Alle Antworten
-
Hallo MH
prüfe:
FileSystemWatcher.NotifyFilter
http://msdn.microsoft.com/de-de/library/system.io.filesystemwatcher.notifyfilter.aspxob dort DirectoryName gesetzt ist:
http://msdn.microsoft.com/de-de/library/system.io.notifyfilters.aspxwobei 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).aspxund 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) -
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
-
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- Als Antwort vorgeschlagen Robert BreitenhoferModerator Montag, 27. September 2010 09:53
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 5. Oktober 2010 11:58
-
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.NotifyFiltereingestellt?
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 Watcherkannst Du alle erdenklichen Einstellungen testen.
Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Montag, 27. September 2010 09:53
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 5. Oktober 2010 11:59