这让我很生气,我不确定我知道如何调试它。
我正在使用 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) 在使用技术支持事件之前,进一步诊断此问题的步骤是什么?