FSEvents神秘地无法在某些文件夹中传递事件

时间:2011-07-27 07:43:38

标签: cocoa macos fsevents

这让我很难过,而且我不确定我是否知道如何调试它。

我正在使用Mac FSEvents API来监控文件系统上的给定文件夹。但是,偶尔会有一些文件夹停止发送任何通知事件。到目前为止,这只发生在〜/ Dropbox中的文件夹中,并且只影响了我的应用程序的一些用户(并且也经常影响我)。

疯狂的部分是“治愈”文件系统的方法是:

mv ~/Dropbox/some/stuck/folder ~/Dropbox/some/stuck/folder.0
mkdir ~/Dropbox/some/stuck/folder
mv ~/Dropbox/some/stuck/folder.0/* ~/Dropbox/some/stuck/folder/
rmdir ~/Dropbox/some/stuck/folder.0

运行这些命令后,文件夹将被取消并开始发送事件!需要几次尝试才能找到哪个父文件夹是罪魁祸首,但它总是在Dropbox中的某个文件夹。 (退出Dropbox或重新启动无法解决问题。)

我的代码没什么特别的。使用以下命令开始监控:

FSEventStreamContext context;
context.version = 0;
context.info = self;
context.retain = NULL;
context.release = NULL;
context.copyDescription = NULL;

_streamRef = FSEventStreamCreate(nil,
                                 (FSEventStreamCallback)FSMonitorEventStreamCallback,
                                 &context,
                                 (CFArrayRef)paths,
                                 kFSEventStreamEventIdSinceNow,
                                 0.25,
                                 kFSEventStreamCreateFlagUseCFTypes);
if (!_streamRef) {
    NSLog(@"Failed to start monitoring of %@ (FSEventStreamCreate error)", _path);
}

FSEventStreamScheduleWithRunLoop(_streamRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
if (!FSEventStreamStart(_streamRef)) {
    NSLog(@"Failed to start monitoring of %@ (FSEventStreamStart error)", _path);
}

并且回调看起来像这样(并不重要):

static void FSMonitorEventStreamCallback(ConstFSEventStreamRef streamRef, FSMonitor *monitor, size_t numEvents, NSArray *eventPaths, const FSEventStreamEventFlags eventFlags[], const FSEventStreamEventId eventIds[]) {
    for (int i = 0; i < numEvents; i++) {
        NSString *path = [eventPaths objectAtIndex:i];
        FSEventStreamEventFlags flags = eventFlags[i];
        [monitor sendChangeEventWithPath:path flags:flags];
    }
}

发生在10.6和10.7上。像FileVault这样没有华而不实的东西是活跃的。

这对我来说看起来像是一个操作系统错误,但我没有在网上找到任何关于此问题的提及。

问题是:

1)你有没有经历过这样的事情?有没有发现?

2)在使用技术支持事件之前,有哪些步骤可以进一步诊断?

1 个答案:

答案 0 :(得分:0)

这是OS X中已知的“FSEvents”错误。它可以创建难以追踪的各种问题。有关该问题的详细信息,请参阅this page。特别是,该页面有一个GitHub repo的链接,其中包含一个实用工具,可以查找机器上易受问题影响的所有目录(不需要在DropBox文件夹中)。