偵聽文件系統更改通知,並在目錄或目錄中的文件發生更改時引發事件。以下摘自MSDN
使用 FileSystemWatcher 監視指定目錄中的更改。可監視指定目錄中的文件或子目錄的更改。可以創建一個組件來監視本地計算機、網絡驅動器或遠程計算機上的文件。
若要監視所有文件中的更改,請將 Filter 屬性設置爲空字符串 ("") 或使用通配符(“*.*”)。若要監視特定的文件,請將 Filter 屬性設置爲該文件名。例如,若要監視文件 MyDoc.txt 中的更改,請將 Filter 屬性設置爲“MyDoc.txt”。也可以監視特定類型文件中的更改。例如,若要監視文本文件中的更改,請將 Filter 屬性設置爲“*.txt”。
可監視目錄或文件中的若干種更改。例如,可監視文件或目錄的 Attributes、LastWrite 日期和時間或 Size 方面的更改。通過將 NotifyFilter 屬性設置爲 NotifyFilters 值之一來達到此目的。有關可監視的更改類型的更多信息,請參見 NotifyFilters。
可監視文件或目錄的重命名、刪除或創建。例如,若要監視文本文件的重命名,請將 Filter 屬性設置爲“*.txt”,並使用爲其參數指定的 Renamed 來調用 WaitForChanged 方法。
Windows 操作系統在 FileSystemWatcher 創建的緩衝區中通知組件文件發生更改。如果短時間內有很多更改,則緩衝區可能會溢出。這將導致組件失去對目錄更改的跟蹤,並且它將只提供一般性通知。使用 InternalBufferSize 屬性來增加緩衝區大小的開銷較大,因爲它來自無法換出到磁盤的非頁面內存,所以應確保緩衝區大小適中(儘量小,但也要有足夠大小以便不會丟失任何文件更改事件)。若要避免緩衝區溢出,請使用 NotifyFilter 和 IncludeSubdirectories 屬性,以便可以篩選掉不想要的更改通知。
有關 FileSystemWatcher 的實例的初始屬性值列表,請參見 FileSystemWatcher 構造函數。
使用 FileSystemWatcher 類時,請注意以下事項。
-
不忽略隱藏文件。
-
在某些系統中,FileSystemWatcher 使用 8.3 短文件名格式報告文件更改。例如,對“LongFileName.LongExtension”的更改可能報告爲“LongFi~.Lon”。
-
此類在類級別上包含一個鏈接要求和一個繼承要求,兩個要求應用於所有成員。如果直接調用方或派生類不具有完全信任權限,則會引發 SecurityException。有關安全要求的詳細信息,請參見 鏈接要求。
複製和移動文件夾
操作系統和 FileSystemWatcher 對象將剪切和粘貼操作或移動操作解釋爲對文件夾及其內容的重命名操作。如果將包含文件的文件夾剪切並粘貼到受監視的文件夾中,則 FileSystemWatcher 對象僅將文件夾報告爲新建,但不能將其內容報告爲新建,因爲實際上只是對它們進行了重命名。
若要接收已將文件夾內容移動或複製到受監視的文件夾中的通知,請根據下表中的建議提供 OnChanged 和 OnRenamed 事件處理程序方法。
事件和緩衝區大小
請注意,有幾個因素可能影響引發哪些文件系統更改事件,如下所述:
-
公共文件系統操作可能會引發多個事件。例如,將文件從一個目錄移到另一個目錄時,可能會引發若干 OnChanged 以及一些 OnCreated 和 OnDeleted 事件。移動文件是一個包含多個簡單操作的複雜操作,因此會引發多個事件。同樣,有些應用程序(例如,防病毒軟件)可能會導致可由 FileSystemWatcher 檢測到的其他文件系統事件。
-
只要磁盤沒有切換或移除,FileSystemWatcher 就可監視它們。因爲 CD 和 DVD 的時間戳和屬性不能更改,所以 FileSystemWatcher 不爲 CD 和 DVD 引發事件。要使該組件正常運行,遠程計算機必須具有所需的這些平臺之一。
-
在 Windows XP(Service Pack 1 之前版本)或者 Windows 2000 SP2 或更低版本中,如果多個 FileSystemWatcher 對象正在監視同一個 UNC 路徑,則只有其中一個對象會引發事件。在運行 Windows XP SP1 及之後版本、Windows 2000 SP3 或之後版本或者 Windows Server 2003 的計算機上,所有 FileSystemWatcher 對象都將引發相應的事件。
-
設置 Filter 不會減少進入緩衝區中的內容。
請注意,由於 Windows 操作系統的依賴項,當丟失某個事件或超出緩衝區大小時,FileSystemWatcher 不會引發 Error 事件。若要防止丟失事件,請遵從這些準則:
-
使用 InternalBufferSize 屬性增加緩衝區大小可以防止丟失文件系統更改事件。
-
避免監視帶有長文件名的文件。考慮使用較短的名稱進行重命名。
-
儘可能使事件處理代碼短小。
例如,如果一組用戶在合作處理一個存儲在服務器共享目錄下的文檔時,可以使用FileSystemWatcher組件編寫應用程序來監視對共享目錄的更改情況。當檢測到更改時,該組件可以運行處理過程,通過電子郵件通知每個用戶。
可以配置組件來監視整個目錄及其內容,或特定目錄下一個特定的文件或一組文件。若要監視所有文件中的更改,應將Filter屬性設置爲空字符串("");若要監視特定的文件,應將Filter屬性設置爲該文件的文件名(例如,若要監視文件MyDoc.txt中的更改,將Filter屬性設置爲"MyDoc.txt");也可以監視特定文件類型中的更改,例如若要監視文本文件中的更改,將Fillter屬性設置爲"*.txt"。
【提示】不要忽略隱藏文件。
可監視目錄或文件中的若干種更改。例如,可監視文件或目錄的Attributes、LastWrite的日期和時間或Size的更改。通過將 FileSystemWatcher.NotifyFilter屬性設置爲NotifyFilters中的某個值,就可以實現這個目標。
還可以監視文件或目錄的重命名、刪除或創建。例如,若要監視文本文件的重命名,可將Filter屬性設置爲"*.txt",並調用一個WaitForChanged方法,並設置該方法中WatcherChangeTypes的值爲Renamed。
下面舉例說明。創建一個FileSystemWatche組件來監視運行時指定的目錄。組件被設置用來監視LastWrite和 LastAccess時間的更改,以及目錄中文本文件的創建、刪除或重命名。如果文件被更改、創建或刪除,則文件的路徑就會被輸出到控制檯。當一個文件被重命名時,舊的和新的路徑都被輸出到控制檯。
- using System;
- using System.IO;
- public class watcher
- {
- public static void Main(string[] args)
- {
- //如果沒有指定目錄,則退出程序
- if(args.Length!=1)
- {
- //顯示調用程序的正確方法
- Console.WriteLine("usage:Watcher.exe(directory)");
- return;
- }
- //創建一個新的FileSystemWatcher並設置其屬性
- FileSystemWatcher watcher=new FileSystemWatcher();
- watcher.Path=args[O];
- /*監視LastAcceSS和LastWrite時間的更改以及文件或目錄的重命名*/
- watcher.NotifyFilter=NotifyFilters.LastAccess | NotifyFilters.LastWrite |
- NotifyFilters.FileName | NotifyFilters.DirectoryName;
- //只監視文本文件
- watcher.Filter="*.txt";
- //添加事件句柄
- //當由FileSystemWatcher所指定的路徑中的文件或目錄的
- //大小、系統屬性、最後寫時間、最後訪問時間或安全權限
- //發生更改時,更改事件就會發生
- watcher.Changed +=new FileSystemEventHandler(OnChanged);
- //由FileSystemWatcher所指定的路徑中文件或目錄被創建時,創建事件就會發生
- watcher.Created +=new FileSystemEventHandler(OnChanged);
- //當由FileSystemWatcher所指定的路徑中文件或目錄被刪除時,刪除事件就會發生
- watcher.Deleted +=new FileSystemEventHandler(OnChanged) ;
- //當由FileSystemWatcher所指定的路徑中文件或目錄被重命名時,重命名事件就會發生
- watcher.Renamed +=new RenamedEventHandler(OnRenamed);
- //開始監視
- watcher.EnableRaisingEvents=true;
- //等待用戶退出程序
- Console.WriteLine("Press/'q/' to quit the sample.");
- while(Console.Read()!='q');
- }
- //定義事件處理程序
- public static void OnChanged(object sender,FileSystemEventArgs e)
- {
- //指定當文件被更改、創建或刪除時要做的事
- Console.WriteLine("file:"+e.FullPath+""+e.ChangeType);
- }
- public static void OnRenamed(object sender,RenamedEventArgs e)
- {
- //指定當文件被重命名時發生的動作
- Console.WriteLine("Fi]e:{0} renamed to{1}",e.OldFullPath,e.FullPath);
- }