2012-06-26 7 views
11

Ich möchte ein Verzeichnis (von Tausenden von Dateien, mit etwa 5 Ebenen von Unterverzeichnissen) für, wenn Dateien geändert werden. Ich weiß, dass ich die FSEvents-API verwenden kann, um ein Verzeichnis zu überwachen, wenn sich Dateien innerhalb dieses Verzeichnisses ändern, aber ich kann nicht herausfinden, wie man bestimmt, welche Datei (en) sich geändert hat. This Referenz schlägt vor, ich baue einen Binärbaum und durchquere den Baum jedes Mal, wenn ein Ereignis ausgelöst wird, ist das die beste Weise zu bestimmen, welche Dateien geändert wurden? Wenn nicht, was sind bessere Alternativen?Watch-Verzeichnis für Dateiänderungen

Ist es besser, rekursiv das Verzeichnis zu durchsuchen und kqueue an jede Datei anzuhängen? Ich bin mir nicht sicher, wie gut das bei Tausenden von Dateien funktionieren würde.

Antwort

8

Ich habe UKKQueue vorher mit gemischten Ergebnissen verwendet.

Ich habe vor kurzem eine bessere Lösung kennengelernt, aber ich habe das nicht versucht. Wenn Sie nur Lion als Ziel auswählen müssen, ist der neue Best-Practice-Weg, dies zu tun, ein NSFileCoordinator. Sie implementieren die Methoden der NSFilePresenter, um anzuzeigen, in welchem ​​Verzeichnis Sie interessiert sind in (der presentedItemURL Eigenschaft) und das System benachrichtigt Sie, wenn ein Unterpunkt bewegt/Änderungen/gelöscht wird (über Methoden wie presentedSubitemDidChangeAtURL:)

Ich würde gerne zu hören, wie das funktioniert, wenn Sie diesen Weg gehen.

+0

Jesse, haben Sie versucht, mit NSFileCoordinator/NSFilePresenter die Überwachung einiger Ordner zu implementieren? Ich konnte diese Lösung nicht funktionieren lassen - sie informiert mich einfach nicht über irgendwelche Ereignisse. –

+0

@DaveNewman NSFileCoordinator funktioniert nur, wenn das Programm, das die Änderungen vornimmt, es auch verwendet. (d. h. es ist eine Opt-In-API) Die meisten Cocoa-Programme werden dies tun; Werden die Änderungen möglicherweise von einer untergeordneten API vorgenommen? –

+0

Ich verstehe es nicht. Zum Beispiel habe ich einen Datei-Presenter für meinen Ordner erstellt, z. B. "/ Users/Dave/MyFolder". Wenn ich jetzt Dateien in dieses Verzeichnis ablege (Drag & Drop), wird nur die Methode 'presentedSubitemDidChangeAtURL:' vom System aufgerufen, aber nicht 'presentedSubitemDidAppearAtURL:'. Es ruft auch nicht "accommodatePresenedSubitemDeletionAtURL" auf, wenn ich einige Dateien im Finder lösche. Habe ich etwas vergessen? –

6

Wenn Sie Ihren Stream mit kFSEventStreamCreateFlagFileEvents erstellen, erhalten Sie Ereignisse für die Änderungen an jeder Datei und nicht nur eine Benachrichtigung über die Änderung des überwachten Verzeichnisses. Leider ist dies nur in OSX 10.7 und höher verfügbar.

Verwandte Themen