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.