Sono in ascolto per le modifiche della directory e del disco in un progetto Cocoa utilizzando FSEvents
. Ho bisogno di ottenere eventi quando una cartella principale viene rinominata o cancellata. Quindi, ho passato kFSEventStreamCreateFlagWatchRoot
durante la creazione di FSEventStream
. Ma anche se cancello o rinominare la cartella radice non sto ottenendo il corrispondente FSEventStreamEventFlags
. Qualche idea su quale potrebbe essere il problema. Sto ascoltando le modifiche in un dispositivo USB montato. Ho usato sia FSEventStreamCreate
e FSEventStreamCreateRelativeToDevice
. Una cosa che le comunicazioni è quando provo con FSEventStreamCreate
ricevo il seguente messaggio di errore durante la creazione FSEventStream
:Come ascoltare le modifiche al file system MAC - kFSEventStreamCreateFlagWatchRoot
(
CarbonCore.framework
)FSEventStreamCreate
:watch_all_parents
:
errore nel tentativo di aggiungere kqueue perfd 7
(/Volumes/NO NAME
; Operazione non supportata)
ma con FSEventStreamCreateRelativeToDevice
non ci sono errori, ma ancora non ottenere kFSEventStreamEventFlagRootChanged
in bandiere di eventi. Inoltre, durante la creazione utilizzando FSEventStreamCreateRelativeToDevice
apple dire se voglio ascoltare le modifiche al percorso radice passare la stringa emty ""
. Ma non sono in grado di ascoltare le modifiche al percorso radice passando una stringa vuota. Ma quando passo "/"
funziona. Ma anche per "/"
non ho alcun diritto FSEventStreamEventFlags
. Sto incollando il codice qui: torna
-(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);
}
chiamata di funzione:
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]]);
}
}
Grazie mille in anticipo.
Non sono sicuro di cosa non ci sia perché non ho mai utilizzato FSEvents. Detto questo, sembra che quello che stai cercando di fare potrebbe essere fatto meglio usando il framework DiskArbitration. –