Frage

Ich möchte meinen Code benachrichtigt werden, wenn eine Datei unter (entweder direkt oder indirekt) ein bestimmtes Verzeichnis geändert wird. Mit „modifiziert“, ich meine ich meinen Code benachrichtigt werden soll, wenn der Inhalt einer Datei geändert werden, wird es umbenannt, oder es ist gelöscht; oder wenn eine neue Datei hinzugefügt wird. Für meine Anwendung kann es Tausende von Dateien sein.

Ich sah aus, als FSEvents, aber seine Technologie Übersicht sagt unter anderem:

  

Der wichtige Punkt wegzunehmen ist, dass die Granularität der Meldungen in einem Verzeichnisebene ist. Es sagt Ihnen, nur, dass etwas in dem Verzeichnis hat sich geändert, aber nicht sagen, was sich geändert.

Er sagt auch:

  

Das Dateisystem Ereignisse API ist auch nicht dafür ausgelegt, um herauszufinden, wenn eine bestimmte Datei ändert. Für diese Zwecke ist der kqueues Mechanismus besser geeignet.

Um jedoch kqueue auf einer bestimmten Datei zu verwenden, muss man die Datei öffnen einen Dateideskriptor zu erhalten. Es ist unpraktisch, Tausende von Datei-Deskriptoren zu verwalten (und würde wahrscheinlich die maximal zulässige Anzahl offener Dateien überschreitet sowieso).

Merkwürdigerweise unter Windows, kann ich die ReadDirectoryChangesW() Funktion verwenden und es tut genau das, was ich will.

Wie kann man also tun, was ich unter Mac OS X will? Oder fragte eine andere Art und Weise: Wie würde man gehen über das Äquivalent von ReadDirectoryChangesW() für Mac OS X in den User-Space zu schreiben (und tun dies sehr effizient)

?
War es hilfreich?

Lösung

Ich habe das selbst nicht ausprobiert, aber es scheint, wie FSEvents in der Lage, Dateiebene Meldungen ab 10.7 (Lion) zur Verfügung zu stellen. Von die Beschreibung der FSEventStreamCreateFlags :

  

kFSEventStreamCreateFlagFileEvents

     

Anfrage auf Dateiebene Benachrichtigungen. Ihr Stream wird Ereignisse über einzelne Dateien in der Hierarchie erhalten Sie beobachten, anstatt nur Verzeichnisebene Benachrichtigungen erhalten. Verwenden Sie diese Flagge mit Vorsicht, da sie erzeugen deutlich mehr Veranstaltungen als ohne.

     

Erhältlich in OS X v10.7 und höher.

Andere Tipps

EDIT:. Nicht überprüft, aber Konstantin unten zeigt, dass dieser Code Probe ab dem Jahr 2012 ist veraltet

Ich glaube nicht, dass es eine spezielle API für das, was Sie suchen. Apple enthält Beispielcode für ein ähnliches Problem namens Watcher . Es ist nicht das, was Sie suchen, aber es ist über das Beste, was Sie an diesem Punkt tun können. Sie haben Schnappschüsse des Verzeichnisses zu nehmen, und es erneut prüfen, wenn Sie etwas geändert erfahren. Änderungszeit ist das Beste, was natürlich zu überprüfen, wenn Sie Änderungszeit vertrauen können.

Sie sind wahrscheinlich richtig, dass für eine unbeschränkte Anzahl von kqueues zu registrieren versuchen, wahrscheinlich nicht zu realisieren wäre.

Der nächste Dienstprogramm (die ich kenne), die Ihre Bedürfnisse auf Mac OS X übereinstimmt ist fslogger. Siehe den Link für eine Beschreibung, dmg und Quellcode: OSXBook - fslogger

Sie möchten vielleicht man fs_usage überprüfen, wenn es in ein Verzeichnis nicht spezifisch ist und erfordert Root-Rechten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top