這是殺了我,我不知道我知道如何處理它的調試。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這樣的花哨的東西處於活動狀態。
這看起來像一個操作系統的bug,但我沒有發現任何在網絡上提到的這個問題。
的問題是:
1)你有沒有經歷過這樣的事情?任何發現?
2)在使用技術支持事件之前,進一步診斷此問題的步驟是什麼?
呃,這聽起來像是你的應用程序和Dropbox之間的衝突。請注意,Dropbox也使用FSEvents觀看Dropbox文件夾內的更改。 – Yuji
你有沒有找到解決方法?我看到了同樣的問題,我的理論是Dropbox對FSEvent的使用被阻塞。有趣的是,因爲Google雲端硬盤沒有這種阻塞問題。 –
我也是 - 但僅限於某些用戶,即使在Dropbox關閉時也會繼續。也許Dropbox留下了一些元數據,通過更改文件夾的名稱被取消失效 – petenelson