偵聽文件系統更改通知,并在目錄或目錄中的文件發生更改時引發事件。
命名空間:System.IO
程序集:System(在 system.dll 中)
繼承層次結構
C# 用法:
1
public?class?FileSystemWatcher?:?Component,?ISupportInitialize 使用 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 對象將剪切和粘貼操作或移動操作解釋為對文件夾及其內容的重命名操作。如果將包含文件的文件夾剪切并粘貼到受監視的文件夾中,則 FileSystemWatcher 對象僅將文件夾報告為新建,但不能將其內容報告為新建,因為實際上只是對它們進行了重命名。
若要接收已將文件夾內容移動或復制到受監視的文件夾中的通知,請根據下表中的建議提供 OnChanged 和 OnRenamed 事件處理程序方法。
?
事件和緩沖區大小
請注意,有幾個因素可能影響引發哪些文件系統更改事件,如下所述:
公共文件系統操作可能會引發多個事件。例如,將文件從一個目錄移到另一個目錄時,可能會引發若干 OnChanged 以及一些 OnCreated 和 OnDeleted 事件。移動文件是一個包含多個簡單操作的復雜操作,因此會引發多個事件。同樣,有些應用程序(例如,防病毒軟件)可能會導致可由 FileSystemWatcher 檢測到的其他文件系統事件。
只要磁盤沒有切換或移除,FileSystemWatcher 就可監視它們。因為 CD 和 DVD 的時間戳和屬性不能更改,所以 FileSystemWatcher 不為 CD 和 DVD 引發事件。要使該組件正常運行,遠程計算機必須具有所需的這些平臺之一。但是,無法從 Windows NT 4.0 計算機監視遠程 Windows NT 4.0 計算機。
在 Windows XP(Service Pack 1 之前版本)或者 Windows 2000 SP2 或更低版本中,如果多個 FileSystemWatcher 對象正在監視同一個 UNC 路徑,則只有其中一個對象會引發事件。在運行 Windows XP SP1 及之后版本、Windows 2000 SP3 或之后版本或者 Windows Server 2003 的計算機上,所有 FileSystemWatcher 對象都將引發相應的事件。
設置 Filter 不會減少進入緩沖區中的內容。
請注意,由于 Windows 操作系統的依賴項,當丟失某個事件或超出緩沖區大小時,FileSystemWatcher 不會引發 Error 事件。若要防止丟失事件,請遵從這些準則:
FileSystemWatcher 成員
公共構造函數
公共事件下面的示例創建一個
FileSystemWatcher,以便在運行時監視指定的目錄。組件設置為監視
LastWrite 和
LastAccess 時間方面的更改,以及目錄中文本文件的創建、刪除或重命名。如果更改、創建或刪除文件,文件路徑將被輸出到控制臺。在文件重命名后,舊路徑和新路徑都輸出到控制臺。
在此示例中使用 System.Diagnostics 和 System.IO 命名空間。
C# 事例:
?1
public?class?Watcher
?2

{
?3
?4
????public?static?void?Main()
?5
????
{
?6
????Run();
?7
?8
????}
?9
10
????[PermissionSet(SecurityAction.Demand,?Name="FullTrust")]
11
????public?static?void?Run()
12
????
{
13
????????string[]?args?=?System.Environment.GetCommandLineArgs();
14
?
15
????????//?If?a?directory?is?not?specified,?exit?program.
16
????????if(args.Length?!=?2)
17
????????
{
18
????????????//?Display?the?proper?way?to?call?the?program.
19
????????????Console.WriteLine("Usage:?Watcher.exe?(directory)");
20
????????????return;
21
????????}
22
23
????????//?Create?a?new?FileSystemWatcher?and?set?its?properties.
24
????????FileSystemWatcher?watcher?=?new?FileSystemWatcher();
25
????????watcher.Path?=?args[1];
26
????????/**//*?Watch?for?changes?in?LastAccess?and?LastWrite?times,?and?
27
???????????the?renaming?of?files?or?directories.?*/
28
????????watcher.NotifyFilter?=?NotifyFilters.LastAccess?|?NotifyFilters.LastWrite?
29
???????????|?NotifyFilters.FileName?|?NotifyFilters.DirectoryName;
30
????????//?Only?watch?text?files.
31
????????watcher.Filter?=?"*.txt";
32
33
????????//?Add?event?handlers.
34
????????watcher.Changed?+=?new?FileSystemEventHandler(OnChanged);
35
????????watcher.Created?+=?new?FileSystemEventHandler(OnChanged);
36
????????watcher.Deleted?+=?new?FileSystemEventHandler(OnChanged);
37
????????watcher.Renamed?+=?new?RenamedEventHandler(OnRenamed);
38
39
????????//?Begin?watching.
40
????????watcher.EnableRaisingEvents?=?true;
41
42
????????//?Wait?for?the?user?to?quit?the?program.
43
????????Console.WriteLine("Press?\'q\'?to?quit?the?sample.");
44
????????while(Console.Read()!='q');
45
????}
46
47
????//?Define?the?event?handlers.
48
????private?static?void?OnChanged(object?source,?FileSystemEventArgs?e)
49
????
{
50
????????//?Specify?what?is?done?when?a?file?is?changed,?created,?or?deleted.
51
???????Console.WriteLine("File:?"?+??e.FullPath?+?"?"?+?e.ChangeType);
52
????}
53
54
????private?static?void?OnRenamed(object?source,?RenamedEventArgs?e)
55
????
{
56
????????//?Specify?what?is?done?when?a?file?is?renamed.
57
????????Console.WriteLine("File:?{0}?renamed?to?{1}",?e.OldFullPath,?e.FullPath);
58
????}
59
}