So überwachen Sie Dateisystemänderungen MAC - kFSEventStreamCreateFlagWatchRoot

8

Ich beobachte Verzeichnisse und Plattenänderungen in einem Cocoa-Projekt mit FSEvents . Ich muss Ereignisse erhalten, wenn ein Stammordner umbenannt oder gelöscht wird. Also habe ich kFSEventStreamCreateFlagWatchRoot übergeben, während ich FSEventStream erstellt habe. Aber selbst wenn ich den Stammordner lösche oder umbenenne, bekomme ich nicht den entsprechenden FSEventStreamEventFlags . Irgendeine Idee, was möglicherweise das Problem sein könnte. Ich höre auf Änderungen in einem USB-Gerät. Ich habe sowohl FSEventStreamCreate als auch FSEventStreamCreateRelativeToDevice benutzt. Eine Sache, die ich merke ist, wenn ich versuche mit FSEventStreamCreate Ich bekomme die folgende Fehlermeldung beim Erstellen von FSEventStream :

  

( CarbonCore.framework ) FSEventStreamCreate : watch_all_parents :
  Fehler beim Hinzufügen von kqueue für fd 7 ( /Volumes/NO NAME ; Operation nicht unterstützt)

Aber mit FSEventStreamCreateRelativeToDevice gibt es keine Fehler, aber immer noch nicht kFSEventStreamEventFlagRootChanged in Event Flags. Während der Erstellung mit FSEventStreamCreateRelativeToDevice apple say's, wenn ich auf Änderungen des Root-Pfades hören möchte, übergeben Sie die emty-Zeichenfolge "" . Aber ich bin nicht in der Lage, Änderungen des Stammpfads zu hören, indem ich leere Strings übergebe. Aber wenn ich "/" passiere, funktioniert es. Aber selbst für "/" bekomme ich kein richtiges FSEventStreamEventFlags . Ich füge den Code hier ein:

%Vor%

Rückruffunktion:

%Vor%

Vielen Dank im Voraus.

    
wantro 28.01.2010, 13:39
quelle

2 Antworten

3

Ich hatte das gleiche Problem und ich denke, ich habe es herausgefunden. Anscheinend kFSEventStreamCreateFlagWatchRoot wird einfach nur bei Verwendung von FSEventStreamCreateRelativeToDevice gesprengt. Sie müssen FSEventStreamCreate verwenden. Da das vorherige Formular vorzuziehen ist, wenn Sie sich auf historische Ereignis-IDs verlassen, müssen Sie möglicherweise zwei Streams erstellen. Beachten Sie außerdem, dass Sie anscheinend nicht kEventFlagChangedRoot an Sie gesendet haben, wenn Ihre App nicht ausgeführt wird. Daher müssen Sie das Verzeichnis beim Starten stattern.

    
Scott S 12.03.2010, 21:28
quelle
3

Ich denke, die Änderung des Datenträgernamens wird nicht als Änderung des von FSEvents gemeldeten Dateisystems gezählt. Denken Sie daran, der Name des Datenträgers selbst existiert nicht wirklich als Dateisystemeintrag. Die unter /Volumes wird vom Betriebssystem bereitgestellt.

Sie wird stattdessen von Disk Arbitration abgedeckt.

Es folgt ein kurzer Beispielcode. Definieren Sie zuerst den Rückruf

%Vor%

und dann den Handler wie folgt installieren

%Vor%     
Yuji 28.01.2010 16:00
quelle

Tags und Links