Я слушаю изменения каталога и диска в проекте Cocoa с использованием FSEvents
. Мне нужно получить события, когда корневая папка переименована или удалена. Итак, я прошел kFSEventStreamCreateFlagWatchRoot
при создании FSEventStream
. Но даже если я удалю или переименую корневую папку, я не получаю соответствующий FSEventStreamEventFlags
. Любая идея, что может быть проблемой. Я слушаю изменения на USB-устройстве. Я использовал оба FSEventStreamCreate
и FSEventStreamCreateRelativeToDevice
. Одна вещь, которую я замечает, когда я пытаюсь с FSEventStreamCreate
я получаю следующее сообщение об ошибке при создании FSEventStream
:Как прослушивать изменения файловой системы MAC-kFSEventStreamCreateFlagWatchRoot
(
CarbonCore.framework
)FSEventStreamCreate
:watch_all_parents
:
ошибка при попытке добавить Kqueue дляfd 7
(/Volumes/NO NAME
, операция не поддерживается)
Но с FSEventStreamCreateRelativeToDevice
ошибок не найдено, но все равно не получается kFSEventStreamEventFlagRootChanged
в флагах событий. Кроме того, в то время как создание с использованием FSEventStreamCreateRelativeToDevice
apple say's, если я хочу прослушивать изменения корневого пути, передает emty string ""
. Но я не могу слушать изменения корневого пути, передавая пустую строку. Но когда я прохожу "/"
, он работает. Но даже для "/"
у меня нет должного FSEventStreamEventFlags
. Я вставить код здесь:
-(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);
}
назад Вызов функции:
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]]);
}
}
Спасибо большое заранее.
Я не уверен, что там не так, потому что я никогда не использовал FSEvents. Сказав это, похоже, что то, что вы пытаетесь сделать, может быть лучше сделано с использованием инфраструктуры DiskArbitration. –