使用.NET FileSystemWatcher对象监控磁盘文件目录的改变
原文(英文):http://www.techrepublic.com/article/use-the-net-filesystemwatcher-object-to-monitor-directory-changes-in-c/6165137
?
許多情況下,如果創建或修改一個文件,系統需要執行某些任務。例如,在一個數據庫中插入文件的系統就是如此。
在這種情況下,程序必須監控目錄中新建立的文件。如果目錄中新建了一個文件,程序必須提取這個文件、進行解析、再把它插入到數據庫中。
許多時候,這類功能要通過“調查”目錄并列舉上次調查后任何新建的文件來完成。在.NET Framework中,微軟為開發者提供另一種連續調查一個目錄中的新建文件的方法——FileSystemWatcher對象。
FileSystemWatcher對象為你完成目錄監控工作。
如果新建、更新或刪除一個文件,FileSystemWatcher將提交一個事 件,通知你發生了一項改變。
這樣,新建一個文件后,你的程序立即就知道可以使用這個文件。
FileSystemWatcher基礎
在應用FileSystemWatcher對象之前,你必須了解這個對象的一些基本屬性和事件。
毫無疑問,這個對象的最重要的屬性為“EnableRaisingEvents”屬性。這個屬性決定對象在收到改變通知時是否提交事件。
如果EnableRaisingEvents屬性設為false,對象將不會提交改變事件。如果設為true,它將提交改變事件。
下面是你在應用FileSystemWatcher對象時將要用到的其它一些重要屬性/事件:
屬性:
- Path——這個屬性告訴FileSystemWatcher它需要監控哪條路徑。例如,如果我們將這個屬性設為“C:\\Temp”,對象就監控那個目錄發生的所有改變。
- IncludeSubDirectories——這個屬性說明FileSystemWatcher對象是否應該監控子目錄中發生的改變。
- Filter——這個屬性允許你過濾掉某些類型的文件發生的變化。例如,如果我們只希望在TXT文件被修改/新建/刪除時提交通知,可以將這個屬性設為“*txt”。在處理高流量或大型目錄時,使用這個屬性非常方便。
事件
- Changed——當被監控的目錄中有一個文件被修改時,就提交這個事件。值得注意的是,這個事件可能會被提交多次,即使文件的內容僅僅發生一項改變。這是由于在保存文件時,文件的其它屬性也發生了改變。
- Created——當被監控的目錄新建一個文件時,就提交這個事件。如果你計劃用這個事件移動新建 的事件,你必須在事件處理器中寫入一些錯誤處理代碼,它能處理當前文件被其它進程使用的情況。之所以要這樣做,是因為Created事件可能在建立文件的 進程釋放文件之前就被提交。如果你沒有準備正確處理這種情況的代碼,就可能出現異常。
- Deleted——當被監控的目錄中有一個文件被刪除,就提交這個事件。
- Renamed——當被監控的目錄中有一個文件被重命名,就提交這個事件。
注:如果你沒有將EnableRaisingEvents設為真,系統不會提交任何一個事件。
如果有時FileSystemWatcher對象似乎無法工作,請首先檢查EnableRaisingEvents,確保它被設為True。
?
事件處理
當FileSystemWatcher調用一個事件處理器時,它包含兩個自變量——一個叫做“sender”的對象和一個叫做“e”的 FileSystemEventArgs對象。我們感興趣的自變量為FileSystemEventArgs自變量。這個對象中包含有提交事件的原因。以 下是FileSystemEventArgs對象的一些屬性:
屬性:
- Name——這個屬性中使事件被提交的文件的名稱。其中并不包含文件的路徑——只包含使用事件被提交的文件或目錄名稱。
- ChangeType——這是一個WatcherChangeTypes,它指出要提交哪個類型的事件。其有效值包括:
○ Changed
○ Created
○ Deleted
○ Renamed - FullPath——這個屬性中包含使事件被提交的文件的完整路徑,包括文件名和目錄名。
代碼實例
列表A列出了FileSystemWatcher對象的一個簡單應用實例。在這個例子中,我們監控“C:\\Temp”目錄中是否建立了*.TXT文件。
這可能是FileSystemWatcher的最簡單用法。
列表A
publicvoid CreateWatcher()
{
//創建FileSystemWatcher對象
FileSystemWatcher watcher = newFileSystemWatcher();
//設置過濾只監控txt文件
watcher.Filter = "*.txt";
//添加一個文件創建事件
watcher.Created += new
FileSystemEventHandler(watcher_FileCreated);
//設置監控的路徑
watcher.Path = @"C:Temp";
//開啟文件監控
watcher.EnableRaisingEvents = true;
}
private void watcher_FileCreated(object sender, FileSystemEventArgs e)
{
Console.WriteLine("A new *.txt file has been created!");
}
?
這篇文章下載版本的樣本項目中還提供了另外一些實例。
?
應用
最初,FileSystemWatcher的用途可能并不明顯。當然,如果一個文件或目錄發生改變,它會向我們發出警報,但在哪些情況下我們需要這類信息呢?
如果一個系統允許客戶端上傳文件進行處理,這時可能就要用到FileSystemWatcher對象。
盡管很明顯我們已經進入Web服務和SOA時 代,但許多系統仍然要將一些文件插入到某些位置,不管是FTP服務器或網絡共享文件夾中。
我已經將FileSystemWatcher對象應用到這種類型的系統中,雖然并不是完全沒有出錯,但它在監控目錄變化方面確實有一定的優勢。
如果你想讓兩個文件保持同步,這時也可以用到FileSystemWatcher對象。你可以用FileSystemWatcher同時監控這兩個文件的位置,如果其中一個出現更新,就提交一個Changed事件;然后你就可以將這些改變復制到其它系統/文件中。
如果你的系統有任何功能需要進行文件或目錄監控,你必須仔細了解那個組件,看是否可以使用FileSystemWatcher對象。在我的應用過程中,這個對象至少為送交給系統的每個文件節省了10秒鐘的時間。
?
?
另附廣告:女朋友的淘寶網店,為她做宣傳,希望大家別介意,http://iyseek.taobao.com? 歡迎大家逛逛,嘿嘿!如有需要幫助,請聯系MSN:zheng331773812@hotmail.com(上班時在線)?? QQ:331773812
歡迎大家共同交流!
轉載于:https://www.cnblogs.com/jsonzheng/archive/2011/06/20/2085053.html
總結
以上是生活随笔為你收集整理的使用.NET FileSystemWatcher对象监控磁盘文件目录的改变的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 那种死法最不痛苦
- 下一篇: 读取 android的内存、cpu、流量