Gibt es so etwas wie inotify unter Windows?

102

Unter Linux gibt es das Ionotify-Subsystem, das eine Anwendung über Änderungen am Dateisystem informiert.

Ich bin jedoch hauptsächlich ein Windows-Benutzer und habe mich gefragt, ob es eine ähnliche Möglichkeit gibt, Änderungen am Dateisystem zu überwachen.

johansson
quelle
9
Ich denke nicht, dass solche Fragen nicht zum Thema gehören. Die Frage fragt nach einer Betriebssystem-API, die sich von jeder Tool- / Software-Bibliothek stark unterscheidet. Möglicherweise kann es anders formuliert sein, wie in einer Windows-Anwendung benachrichtigt wird, wenn bestimmte Dateien geändert werden.
Balki
1
Zur Wiedereröffnung gewählt: Die Frage fragt nach einer vergleichbaren Alternative zu einer bestimmten Betriebssystem-API und lautet für mich im übertragenen Sinne: "Ich komme aus England, wo ich eine Gabel zum Essen benutze. In Japan, welches Utensil verwende ich auf ähnliche Weise?" "" Die akzeptierte Antwort unter Verwendung dieser Analogie lautet "Essstäbchen verwenden".
David

Antworten:

42

Wenn Sie .net verwenden , verwenden Sie FileSystemWatcher. Weitere Informationen finden Sie hier: http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

Wenn Sie mit C , Verwendung FindFirstChangeNotification, FindNextChangeNotification, ReadDirectoryChangesW. Weitere Informationen hier: http://msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx

Unter OSX ist die relevante API die fseventsAPI.

Sie unterscheiden sich alle geringfügig voneinander und weisen in Randfällen eine fragwürdige Zuverlässigkeit auf. Im Allgemeinen können Sie sich nicht auf diese APIs verlassen, um 100% der Zeit eine vollständige Ansicht aller Änderungen zu erhalten. Die meisten Benutzer der Dateisystemüberwachung kombinieren sie mit regelmäßigen Scans, um verlorene oder unvollständige Informationen aus der Push-API zu kompensieren.

blucz
quelle
6
Können Sie bitte einige Zitate über die "fragwürdige Zuverlässigkeit im
Randfall
18
Wenn ein Benutzer einer fs watcher-API Ereignisse langsamer liest als ein anderer Prozess sie generiert, muss der Kernel entweder Dateisystemänderungen im anderen Prozess (möglicherweise mit höherer Priorität) aufhalten oder ein unbegrenztes Wachstum des Puffers ermöglichen. Die Puffertiefe von inotify (wie in der Manpage dokumentiert) wird von / proc / sys / fs / inotify / max_queued_events gesteuert. Darüber hinaus erhalten Sie eine IN_Q_OVERFLOW-Benachrichtigung - das ist gut, aber Sie befinden sich immer noch in einer Situation, in der Sie möglicherweise von Zeit zu Zeit erneut scannen müssen.
Blucz
Aha richtig, ich habe kürzlich in der Warteschlange nachgelesen. Ich denke, dieser Randfall hängt davon ab, wie viele Dateien Sie überwachen, und es hängt auch davon ab, ob es wichtig ist, alle Änderungen zu verfolgen, oder ob einige übersehen werden können. Aber das ist ein guter Punkt. Danke :)
Pharaun
@blucz Ich habe mich gefragt, wie Kernel-Leute diese Situationen lösen. Gut zu wissen, dass sie dies tun, macht einen sicherer in Design und Implementierung.
n611x007
11

JNotify oder FileMon von Microsoft.

Eugene
quelle
8
JNotify war perfekt für mich, da ich plattformübergreifende Kompatibilität benötigte. Ich konnte sogar ein einziges Bash-Skript schreiben, das unter Cygwin, Mac und Linux funktionierte, vorausgesetzt, dass JAVA_HOME korrekt eingestellt war. Dies war eine große Hilfe beim Debuggen von Problemen auf den Computern der Kunden, wenn sie sagten "es hat meine Datei gelöscht!" Ich kann mir das Protokoll ansehen und versuchen herauszufinden, wie / wann das passiert ist.
cmyers
1
FileMon ist jetzt ProcessMonitor technet.microsoft.com/en-us/sysinternals/bb896645
MECU
10

Ein bisschen spät aber ...

Windows verfügt über eine ähnliche Funktion wie OSX-Ereignisse, mit der Sie Ereignisse überwachen können, ohne eine App auszuführen. Das Windows USN Journal verfolgt alle Dateiänderungen. Jeffrey Richter (Autor von Advanced Windows) hat einen großartigen Artikel mit Arbeitsproben für das MSDN Journal geschrieben. Update : Artikel jetzt von archive.org, da MSJ bei MS nicht mehr online ist.

MSDN-Dokumentation für USN Change Journals.

USN Change Journals sind wahrscheinlich besser, wenn Sie Anwendungen wie Sicherungstools oder Indizes erstellen, die ganze Volumes überwachen müssen.

Peter Krnjevic
quelle
Ist das USN Journal anders, vermeidet es das fehlerhafte Verhalten von FileSystemWatcher| , wenn man sich darauf verlässt FindFirstChangeNotification PhillipBrandonHolmes wurde gesprochen von ?
n611x007
4
Es ist schon eine Weile her, dass ich damit gearbeitet habe, aber es werden weder FileSystemWatcher noch FindFirstChangeNotification verwendet. Ich habe angefangen, einen Windows-Ereignisbeobachter in Go zu schreiben, der stark auf Jeffery Richters Beispielen basiert. Nach den Tests, die ich durchgeführt habe, ist es absolut solide und es fehlt nichts, ähnlich wie bei fsevents in OS X. Gist ist hier: gist.github.com/pkrnjevic/7219861
Peter Krnjevic
@PeterKrnjevic Können Sie den Link für den Artikel von Jeffrey Richter aktualisieren?
SOUser
@SOUser, aufgrund von MS Bitrot, ist der Artikel jetzt von archive.org verlinkt.
Peter Krnjevic
3

FileSystemWatcher () ist unzuverlässig, hauptsächlich weil die Fehlerbehandlung für den Watcher-Puffer mehr oder weniger unvollständig ist. Aufgrund des Mangels an Pfad und detaillierten Informationen zur Fehlerbehandlung bietet Microsoft keine Möglichkeit, das Arbeitsverzeichnis wiederherzustellen oder manuell abzufragen.

JNotify für Windows ist ebenfalls unzuverlässig, da dieser Fehler von win32 herrührt. JNotify verwendet win32. Es ist also nicht anders als FileSystemWatcher ().

Phillip Brandon Holmes
quelle
Als ich darüber nachdachte, wie ich Rollen entwerfen sollte, um dieses Problem zu lösen, das der Geschwindigkeit, dem Rennen und dem Überlauf ähnelt, fragte ich mich, wie die Kernel das machten. Interessant. Dies tritt auch bei der Vernetzung und Protokollierung auf. Hat dieses Problem einen Namen?
n611x007
Ja, der Name ist "Bug". Der Fehler (win32) wurde in jedem bisher von Microsoft erstellten Betriebssystem behoben. Dies macht jedes Microsoft-Betriebssystem für eine Lösung vom Typ Dateiüberwachung ungeeignet. Sie müssen * nix gehen, um es zu erreichen. Manchmal denke ich, dass sie diesen Pufferüberlauf aus Sicherheitsgründen absichtlich belassen haben.
Phillip Brandon Holmes
haha .. yeah .. es heißt absichtlich cluster kludge, so dass das Dateisystem von Microsoft nicht absichtlich überwacht werden kann. Es ist ein Fehler, den sie aus Sicherheitsgründen hinterlassen haben.
Phillip Brandon Holmes
1

Ich habe ein bisschen gesucht, ich erinnere mich an etwas Ähnliches für Windows. Es gibt FileSystemWatcher für .NET. Es ist hauptsächlich für NT oder XP und weiter.

Pharaun
quelle
Es ist im Allgemeinen nur auf NTFS-Dateisystemen verfügbar, nicht jedoch auf FAT16, FAT32 oder sogar dem neuen exFAT.
Mastacheata