簡體   English   中英

Mono下的FileSystemWatcher-監視子目錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM