我正在使用FSEvents
. 当根文件夹被重命名或删除时,我需要获取事件。所以,我kFSEventStreamCreateFlagWatchRoot
在创建FSEventStream
. 但即使我删除或重命名根文件夹,我也没有得到相应FSEventStreamEventFlags
的 . 任何想法可能是什么问题。我正在监听 USB 安装设备的变化。我同时使用了FSEventStreamCreate
和FSEventStreamCreateRelativeToDevice
。我注意到的一件事是,当我尝试FSEventStreamCreate
创建时收到以下错误消息FSEventStream
:
(
CarbonCore.framework
)FSEventStreamCreate
:: 尝试为( ; 不支持操作)添加 kqueuewatch_all_parents
时出错fd 7
/Volumes/NO NAME
但是FSEventStreamCreateRelativeToDevice
没有错误,但仍然没有进入kFSEventStreamEventFlagRootChanged
事件标志。此外,在使用FSEventStreamCreateRelativeToDevice
苹果创建时,如果我想收听根路径更改,请传递 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]]);
}
}
提前非常感谢。