[英]FileSystemWatcher under Mono: Heavy CPU load on Linux
[英]FileSystemWatcher under mono - watching subdirs
我有個問題。 我在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)。
路徑不正確的問題已在一年前報告過(看起來已經解決了),但是我的單聲道來自去年12月(MonoDevelop在“參考”部分中說它是4.0.0.0版,這是我可以說的關於發行版),錯誤仍然存在...請參閱: https : //bugzilla.xamarin.com/show_bug.cgi?id=5747
有任何想法嗎? 我真的很好奇,如果有一種解決方法,不需要編寫自己的觀察程序來反復輪詢文件系統,或者不需要為根目錄下的每個文件夾啟動單獨的監視程序...
提前致謝!
據我所知,這在OS X上的Mono中根本不起作用。我上周遇到了它,並且找不到任何錯誤報告,因此我在這里報告了它: https : //bugzilla.xamarin.com/show_bug .cgi?id = 16259
就我可以跟蹤KEventWatcher的實現而言 ,創建觀察器時,它不會做任何事情來訂閱子目錄。 我認為它唯一訂閱子目錄的時間是當它檢測到它們被添加到PostEvent中時。 即使它確實訂閱了創建時的所有子目錄,也可能不是一個很好的解決方案。 底層的kevent機制將要求每個子目錄都有一個打開的文件描述符,最終可能會導致大量的文件描述符。
Mono確實具有FileSystemWatcher的其他實現,但是我相信實現的選擇在編譯時已嵌入到Mono運行時中。 有一個緩慢且效率低下的默認觀察程序,可通過僅每秒大約掃描整個目錄樹的方式在所有平台上運行,但只有在沒有特定於平台的實現可用時才選擇該觀察程序。
恐怕要說,看來最好的選擇是您建議的一種解決方法-手動掃描更改或為每個目錄創建FileSystemWatcher。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.