So warten Sie auf Dateisystemänderungen MAC - kFSEventStreamCreateFlagWatchRoot

Ich empfange Verzeichnis- und Festplattenänderungen in einem Cocoa-Projekt mitFSEvents. Ich muss Ereignisse abrufen, wenn ein Stammordner umbenannt oder gelöscht wird. Also habe ich bestandenkFSEventStreamCreateFlagWatchRoot beim Erstellen derFSEventStream. Aber selbst wenn ich den Stammordner lösche oder umbenenne, erhalte ich keine EntsprechungFSEventStreamEventFlags. Irgendeine Idee, woran es möglicherweise liegen könnte. Ich warte auf Änderungen an einem USB-Gerät. Ich habe beides benutztFSEventStreamCreate undFSEventStreamCreateRelativeToDevice. Eine Sache, die mir auffällt, ist, wenn ich es versucheFSEventStreamCreate Beim Erstellen wird folgende Fehlermeldung angezeigtFSEventStream:

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

Aber mitFSEventStreamCreateRelativeToDevice Es gibt keine Fehler, aber immer noch nichtkFSEventStreamEventFlagRootChanged in event flags. Auch während der Erstellung mitFSEventStreamCreateRelativeToDevice Apfel sagt, wenn ich Root-Pfad-Änderungen anhören will, übergebe emty string"". Aber ich bin nicht in der Lage, Root-Pfadänderungen durch Übergabe einer leeren Zeichenfolge abzuhören. Aber wenn ich vorbeigehe"/" Es klappt. Aber auch für"/" Ich bekomme keine richtigenFSEventStreamEventFlags. Ich füge den Code hier ein:

-(void) subscribeFileSystemChanges:(NSString*) path
{
    PRINT_FUNCTION_BEGIN;

    // if already subscribed then unsubscribe
    if (stream)
    {
        FSEventStreamStop(stream);
        FSEventStreamInvalidate(stream); /* will remove from runloop */
        FSEventStreamRelease(stream);
    }

    FSEventStreamContext cntxt = {0};
    cntxt.info = self;

    CFArrayRef pathsToWatch = CFArrayCreate(NULL, (const void**)&path, 1, NULL);


    stream = FSEventStreamCreate(NULL, &feCallback, &cntxt, 
                                 pathsToWatch, kFSEventStreamEventIdSinceNow, 1,
                                 kFSEventStreamCreateFlagWatchRoot );


    FSEventStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(), 
                                     kCFRunLoopDefaultMode);

    FSEventStreamStart(stream);


}

Rückruffunktion:

static void feCallback(ConstFSEventStreamRef streamRef, void* pClientCallBackInfo, 
                       size_t numEvents, void* pEventPaths, const    FSEventStreamEventFlags eventFlags[], 
                       const FSEventStreamEventId eventIds[]) 

{
char** ppPaths = (char**)pEventPaths; int i;

    for (i = 0; i < numEvents; i++)
    {
        NSLog(@"Event Flags %lu Event Id %llu", eventFlags[i], eventIds[i]); 
        NSLog(@"Path changed: %@", 
              [NSString stringWithUTF8String:ppPaths[i]]); 
    }    
}

Vielen Dank im Voraus.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage