2011-07-27 29 views
4

這是殺了我,我不知道我知道如何處理它的調試。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)在使用技術支持事件之前,進一步診斷此問題的步驟是什麼?

+0

呃,這聽起來像是你的應用程序和Dropbox之間的衝突。請注意,Dropbox也使用FSEvents觀看Dropbox文件夾內的更改。 – Yuji

+0

你有沒有找到解決方法?我看到了同樣的問題,我的理論是Dropbox對FSEvent的使用被阻塞。有趣的是,因爲Google雲端硬盤沒有這種阻塞問題。 –

+0

我也是 - 但僅限於某些用戶,即使在Dropbox關閉時也會繼續。也許Dropbox留下了一些元數據,通過更改文件夾的名稱被取消失效 – petenelson

回答

0

這是OS X中已知的「FSEvents」錯誤。它可以創建各種難以追查的問題。有關該問題的更多信息,請參閱this page。特別是,該頁面有一個鏈接到GitHub repo帶有一個實用程序來查找您的計算機上的所有目錄容易受到問題(這不需要在您的DropBox文件夾中)。

+1

謝謝,但我實際上是這些網頁的作者。 :-)雖然我對你有好消息 - 蘋果聲稱它在10.11被修復。 –

+0

請參閱我們在rb-fsevents票證中的討論,瞭解更多詳細信息和背景(以及在10.11之前的工作解決方案!) –

+0

啊,我沒有在發帖之前查看用戶名!否則,我不會發布。我剛剛在你的repo btw提交了兩個問題。很棒的工作! :) – cjerdonek