如何监听文件系统更改MAC-kFSEventStreamCreateFlagWatchRoot

wan*_*tro 9 cocoa fsevents

我在使用Cocoa项目监听目录和磁盘更改FSEvents.我需要在重命名或删除根文件夹时获取事件.所以,我kFSEventStreamCreateFlagWatchRoot在创建时通过了FSEventStream.但即使我删除或重命名根文件夹,我也没有得到相应的FSEventStreamEventFlags.知道可能是什么问题.我正在听USB安装设备的更改.我用过FSEventStreamCreateFSEventStreamCreateRelativeToDevice.我注意到的一件事是当我尝试时,FSEventStreamCreate我在创建时收到以下错误消息FSEventStream:

(CarbonCore.framework)FSEventStreamCreate:watch_all_parents:
错误尝试添加的kqueue为fd 7(/Volumes/NO NAME;不支持操作)

但是FSEventStreamCreateRelativeToDevice没有错误但仍然没有进入kFSEventStreamEventFlagRootChanged事件标志.此外,虽然使用FSEventStreamCreateRelativeToDeviceapple说创建,如果我想听根路径更改传递emty字符串"".但是我无法通过传递空字符串来监听根路径更改.但是,当我通过"/"它工作.但即使"/"我没有得到任何适当的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);


}
Run Code Online (Sandbox Code Playgroud)

回电功能:

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]]); 
    }    
}
Run Code Online (Sandbox Code Playgroud)

非常感谢提前.

Sco*_*t S 3

我遇到了同样的问题,我想我已经解决了。显然kFSEventStreamCreateFlagWatchRoot只是在使用时被破坏了FSEventStreamCreateRelativeToDevice。你必须使用FSEventStreamCreate. 由于如果您依赖历史事件 ID,则前一种形式更可取,因此您可能需要创建 2 个流。另请注意,如果您的应用程序未运行,则似乎不会kEventFlagChangedRoot发送给您,因此您需要在启动时统计目录。