Ist es möglich, mit FSEvents Benachrichtigungen darüber zu erhalten, dass ein Ordner verschoben wurde?

8

Ich verwende die FSEvents-API, um Benachrichtigungen über Änderungen in einem lokalen Verzeichnis zu erhalten, das ich tracke.

Ist es möglich, eine Benachrichtigung zu erhalten, dass das überwachte Verzeichnis an einen anderen Ort auf der Festplatte verschoben wurde, indem Sie FSEvents oder etwas anderes verwenden?

Aktualisierung:

Hier ist der Code, den ich bis jetzt habe, ich versuche jetzt das Flag kFSEventStreamCreateFlagWatchRoot mit FSEventStreamCreate zu verwenden, um die root-geänderte Benachrichtigung zu erhalten, bisher ohne Erfolg.

%Vor%     
Joe Ricioppo 27.04.2011, 03:28
quelle

1 Antwort

6

Ja. Übergeben Sie kFSEventStreamCreateFlagWatchRoot als letztes Argument an FSEventStreamCreate , und Sie werden benachrichtigt, wenn das Verzeichnis verschoben oder umbenannt wird. Aus den Dokumenten :

  

Fordern Sie Benachrichtigungen über Änderungen entlang des Pfads zu den beobachteten Pfaden an. Wenn Sie beispielsweise mit diesem Flag "/ foo / bar" ansehen und es in "/foo/bar.old" umbenannt wird, erhalten Sie ein RootChanged-Ereignis. Dasselbe gilt, wenn das Verzeichnis "/ foo" umbenannt wurde. Das Ereignis, das Sie erhalten, ist ein spezielles Ereignis: Der Pfad für das Ereignis ist der ursprüngliche Pfad, den Sie angegeben haben, das Flag kFSEventStreamEventFlagRootChanged ist gesetzt und die Ereignis-ID ist Null. RootChanged-Ereignisse sind nützlich, um anzuzeigen, dass Sie eine bestimmte Hierarchie erneut durchsuchen sollten, da sie sich vollständig geändert hat (im Gegensatz zu den darin enthaltenen Dingen). Wenn Sie den aktuellen Speicherort eines Verzeichnisses verfolgen möchten, empfiehlt es sich, das Verzeichnis vor dem Erstellen des Streams zu öffnen, damit Sie über einen Dateideskriptor verfügen und F_GETPATH ​​fcntl () ausgeben können, um den aktuellen Pfad zu finden.

Bearbeiten: fcntl-Beispiel hinzufügen

Dieses Cocoadev-Beispiel legt nahe, dass der Autor ein wenig unerfahren mit Zeigern ist. Der pathIntPointer ist nicht nur unnötig, sondern auch die Ursache Ihres Problems. Eine Fehlerüberprüfung des Rückgabecodes von fnctl hätte es erwischt. Hier ist eine überarbeitete Version Ihres Rückrufs:

%Vor%     
more tension 27.04.2011, 05:24
quelle

Tags und Links