2013-05-13 73 views
5

我遇到問題。我用FileSystemWatcher寫了一個包裝,它檢測文件夾及其所有子文件夾中的更改。沒有什麼奇特的:FileSystemWatcher在單播觀看子目錄下

FileSystemWatcher watcher = new FileSystemWatcher(); 
watcher.Path = this.Root; 
watcher.IncludeSubdirectories = true; 
watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.LastAccess | NotifyFilters.DirectoryName | NotifyFilters.FileName; 
watcher.Changed += new FileSystemEventHandler (watcher_Changed); 
watcher.Deleted += new FileSystemEventHandler (watcher_Deleted); 
watcher.Created += new FileSystemEventHandler (watcher_Created); 
watcher.Renamed += new RenamedEventHandler (watcher_Renamed); 
watcher.EnableRaisingEvents = true; 

在.NET中,在Windows下,它就像一個魅力。但是,當我將代碼移植到mono並在OSX下運行代碼時,它只能在根文件夾中正常工作。

問題我已經通過,現在發現:

  • 事件不會在觀察者開始

  • 路徑我通過EventArgs.FullPath屬性獲取時間下根已經存在的文件夾內,提高了操作不正確(當我將一個文件複製到path_to_root/some/more/subdirs/some.file時,我得到的路徑就是path_to_root/some.file)。

與unproper路徑問題已經被報道一年前(和看起來好像是解決了),但我的單來自於去年十二月(MonoDevelop的說,在參考部分是4.0.0.0版本,它是所有我可以說的分佈)和錯誤仍然存​​在... 請參閱: https://bugzilla.xamarin.com/show_bug.cgi?id=5747

任何想法?我真的很好奇,如果有一個解決方法不需要寫自己的觀察者輪詢文件系統重複或啓動每個文件夾下的每個文件夾 ...

在此先感謝!

+0

可能,這可以幫助:不淨FileSystemWatcher的工作與 - 單上-MAC-OS] [1] [1]:http://stackoverflow.com/問題/ 5727652/do-net-filesystemwatcher-work-with-mono-on-mac-os – 2013-05-13 10:55:08

+0

看到這個話題,不幸的是我找不到任何幫助...但謝謝! – wojtuch 2013-05-13 10:58:28

+0

如果5747修正錯誤的未解決您的情況,您應該簡單地建立在http://bugzilla.xamarin.com – knocte 2013-08-09 12:22:21

回答

5

據我所知,這根本不單在OS X上工作,我在上週遇到過,但沒有找到任何錯誤報告,所以我在這裏報道的那樣:https://bugzilla.xamarin.com/show_bug.cgi?id=16259

據因爲我可以按照implementation of KEventWatcher,當創建觀察器時,它不會執行任何操作來訂閱子目錄。我認爲它只訂閱子目錄的時間是當它檢測到它們被添加到PostEvent中時。即使它確實訂閱了所有創建的子目錄,但它可能不是一個好的解決方案。底層的kevent機制需要爲每個子目錄打開一個文件描述符,這可能最終成爲大量的文件描述符。

Mono確實有FileSystemWatcher的其他實現,但是我相信當它被編譯時,實現的選擇會被納入Mono運行時。有一個緩慢而低效的默認觀察器,可以在所有平臺上工作,只需每隔一秒左右掃描整個目錄樹,但只有在沒有可用的平臺特定實現時才能選擇。

我不敢說,看起來最好的選擇是你建議的解決辦法之一 - 手動掃描更改或爲每個目錄創建一個FileSystemWatcher。

+0

一個新的不同的錯誤沒有得到如此之深成您所描述的細節,我決定寫我自己的「守望者」 - 我只是輪詢文件系統和手動檢測更改的項目 - 一個位的開銷,但好... 我從移植的Windows程序的MacOS學到的最重要的事情 - 學習Objective C或僱用人誰可以。當您發現另一個未實施/不工作的功能時,它將爲您節省頭痛。檢測網絡狀態,電源變化等 – wojtuch 2013-11-20 11:34:19