Estoy escuchando cambios de directorio y disco en un proyecto de Cocoa usando FSEvents
. Necesito obtener eventos cuando se renombra o borra una carpeta raíz. Por lo tanto, pasé kFSEventStreamCreateFlagWatchRoot
al crear el FSEventStream
. Pero incluso si elimino o cambio el nombre de la carpeta raíz, no obtendré el correspondiente FSEventStreamEventFlags
. Alguna idea de lo que podría ser el problema. Estoy escuchando los cambios en un dispositivo USB montado. Usé ambos FSEventStreamCreate
y FSEventStreamCreateRelativeToDevice
. Una cosa avisos I es cuando trato con FSEventStreamCreate
me sale el siguiente mensaje de error al crear FSEventStream
:Cómo escuchar los cambios del sistema de archivos MAC - kFSEventStreamCreateFlagWatchRoot
(
CarbonCore.framework
)FSEventStreamCreate
:watch_all_parents
:
error al intentar añadir kqueue parafd 7
(/Volumes/NO NAME
; Operación no admitida)
Pero con FSEventStreamCreateRelativeToDevice
no hay errores pero todavía no obtiene kFSEventStreamEventFlagRootChanged
en indicadores de eventos. Además, durante la creación usando FSEventStreamCreateRelativeToDevice
apple dice que si quiero escuchar los cambios de la ruta de acceso, pase la cadena emty ""
. Pero no puedo escuchar los cambios en la ruta de acceso pasando cadena vacía. Pero cuando paso "/"
, funciona. Pero incluso para "/"
no obtengo ningún FSEventStreamEventFlags
apropiado. Estoy pegando el código aquí:
-(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);
}
función de retrollamada:
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]]);
}
}
Muchas gracias por adelantado.
No estoy seguro de lo que sucede allí porque nunca he usado FSEvents. Habiendo dicho eso, parece que lo que estás tratando de hacer podría hacerse mejor usando DiskArbitration framework. –