2009-05-27 13 views
1

Ich möchte Dateisystemereignisse für ein paar Verzeichnisse auf dem Mac überwachen. Die Verzeichnisse möchte ich könnte überwachen während der Laufzeit ändern, so FSEvents hier mit, was meine app tut:FSEvents Verrücktheit auf OS X Leopard

  • schafft eine globale Callback-Funktion Rückrufe zu handhaben
  • einen neuen FSEventStreamRef pro Ordner erstellen, mit dem Callback-Zuordnung erstellt oben und einen Zusammenhang mit dem Eventstream hinzufügen, die ich die Änderung Rückruf mit diesem Ordner arbeiten meist

Stuff scheint zu assoziieren hilft, aber ich habe einige Seltsamkeit in, wenn die Rückrufe bemerkt werden aufgerufen, und das sein ‚eventPaths‘ Werte an den Rückruf gesendet. Wenn ich zum Beispiel StreamRefs für/Foo und/Bar erstellt habe, wenn ich eine Datei in/Bar hinzufüge, wird mein Callback fast sofort aufgerufen, aber die eventPaths verweist auf eine Position in/Foo und den Kontext, dem ich zugeordnet bin mit StreamRef ist auch das von/Foo.

Oder sagen, ich überwach/Foo und/Bar und dann entfernen/Bar (durch Anhalten und Schließen der StreamRef for/Bar richtig). Ich erstelle jetzt einen neuen FSEventStreamRef for/Fee und verbinde mich mit demselben Callback. Alle Änderungen an/Fee bewirken nicht, dass der Callback aufgerufen wird, aber Änderungen an/Foo setzen den Callback fort.

Jedes Beispiel oder Dokumentation, die ich online gesehen habe, spricht nur von der Überwachung eines einzelnen Ordners. Gibt es Probleme damit, wie ich die einzelnen Rückrufe mit mehreren FSEventStreamRefs verknüpfe? Es hört sich so an, als ob das kein Problem sein sollte ...

Hat jemand etwas Ähnliches in einer Weise getan, die zuverlässig funktioniert, oder irgendwelche Vorschläge für das, was ich anders ausprobieren könnte?

Eine Sache, die ich versuchte zu tun, als ich damit experimentierte, ist eine einzige FSEventStreamRef und übergeben Sie eine CFArrayRef mit allen Pfaden, die ich wollte, und wenn meine Beobachtungsliste ändert schließen und neu erstellen Sie eine neue FSEventStreamRef Das funktioniert sogar noch schlimmer als oben.

Antwort

4

Works for me. emuliert ich diese Eigenschaften:

  1. Ein Weg pro Stream
  2. Ein Kontext pro Weg/Bach
  3. Ein Rückruf für alle
Streams

Können Sie den Code zeigen, fehlgeschlagen ist ?

+0

+1 für die Beantwortung Ihrer Quelle freigeben. Auf bitbucket;) – NicDumZ

+0

Yup, guten Ruf. Ich habe gerade auf jemanden hingewiesen, der sich über FSEvents Gedanken macht: http://stackoverflow.com/questions/2815502/automatic-screenshot-uploading-on-mac-like-cloud-app/ zu dieser Antwort, da es ein schönes Beispiel dafür ist um ein paar Ordner zu überwachen. –

+0

Wer hat einen Beispielcode, der das funktioniert? – cksubs