cocoa - FSEvents 神秘地无法传递某些文件夹中的事件

标签 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) 在使用技术支持事件之前进一步诊断此问题的步骤是什么?

最佳答案

这是 OS X 中已知的“FSEvents”错误。它可能会产生各种难以追踪的问题。请参阅this page有关该问题的更多信息。特别是,该页面有一个指向 GitHub repo 的链接。使用实用程序查找计算机上容易出现问题的所有目录(不必位于 DropBox 文件夹中)。

关于cocoa - FSEvents 神秘地无法传递某些文件夹中的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6841010/

相关文章:

c++ - 是否可以从 FSEvent id 获取文件名?

objective-c - cocoa 和OpenGL : failed to draw cube

cocoa - 绑定(bind)到 NSCollectionView 中 NSCheckBoxes 的选中状态和字符串值

cocoa - 当对象从 NSOperations 添加到托管对象上下文时,NSOutlineView 不刷新

ruby - MacRuby 中的 FSEvents : wrong callback is executed

python - 看门狗(osx)不通知远程网络更改

objective-c - NSBundle,可以用来保存项目文档吗?

c++ - 我如何使用堆栈但避免 C++ 中的堆栈溢出

swift - 为什么使用 NetFSMountURLSync 的命令行参数中的瑞典语字符不起作用?

android 模拟器不在 iMac 中的蓝牙耳机上播放声音