偵聽(tīng)文件系統(tǒng)更改通知,并在目錄或目錄中的文件發(fā)生更改時(shí)引發(fā)事件。
命名空間:System.IO
程序集:System(在 system.dll 中)
繼承層次結(jié)構(gòu)
C# 用法:
1
public?class?FileSystemWatcher?:?Component,?ISupportInitialize 使用 FileSystemWatcher 監(jiān)視指定目錄中的更改。可監(jiān)視指定目錄中的文件或子目錄的更改。可以創(chuàng)建一個(gè)組件來(lái)監(jiān)視本地計(jì)算機(jī)、網(wǎng)絡(luò)驅(qū)動(dòng)器或遠(yuǎn)程計(jì)算機(jī)上的文件。
若要通過(guò)文件擴(kuò)展名監(jiān)視所有文件中的更改,請(qǐng)將 Filter 屬性設(shè)置為空字符串 ("") 或使用通配符(“*.*”)。若要監(jiān)視特定的文件,請(qǐng)將 Filter 屬性設(shè)置為該文件名。例如,若要監(jiān)視文件 MyDoc.txt 中的更改,請(qǐng)將 Filter 屬性設(shè)置為“MyDoc.txt”。也可以監(jiān)視特定類型文件中的更改。例如,若要監(jiān)視文本文件中的更改,請(qǐng)將 Filter 屬性設(shè)置為“*.txt”。
可監(jiān)視目錄或文件中的若干種更改。例如,可監(jiān)視文件或目錄的 Attributes、LastWrite 日期和時(shí)間或 Size 方面的更改。通過(guò)將 NotifyFilter 屬性設(shè)置為 NotifyFilters 值之一來(lái)達(dá)到此目的。有關(guān)可監(jiān)視的更改類型的更多信息,請(qǐng)參見(jiàn) NotifyFilters。
可監(jiān)視文件或目錄的重命名、刪除或創(chuàng)建。例如,若要監(jiān)視文本文件的重命名,請(qǐng)將 Filter 屬性設(shè)置為“*.txt”,并使用為其參數(shù)指定的 Renamed 來(lái)調(diào)用 WaitForChanged 方法。
Windows 操作系統(tǒng)在 FileSystemWatcher 創(chuàng)建的緩沖區(qū)中通知組件文件發(fā)生更改。如果短時(shí)間內(nèi)有很多更改,則緩沖區(qū)可能會(huì)溢出。這將導(dǎo)致組件失去對(duì)目錄更改的跟蹤,并且它將只提供一般性通知。使用 InternalBufferSize 屬性來(lái)增加緩沖區(qū)大小的開(kāi)銷較大,因?yàn)樗鼇?lái)自無(wú)法換出到磁盤的非頁(yè)面內(nèi)存,所以應(yīng)確保緩沖區(qū)大小適中(盡量小,但也要有足夠大小以便不會(huì)丟失任何文件更改事件)。若要避免緩沖區(qū)溢出,請(qǐng)使用 NotifyFilter 和 IncludeSubdirectories 屬性,以便可以篩選掉不想要的更改通知。
有關(guān) FileSystemWatcher 的實(shí)例的初始屬性值列表,請(qǐng)參見(jiàn) FileSystemWatcher 構(gòu)造函數(shù)。
使用 FileSystemWatcher 類時(shí),請(qǐng)注意以下事項(xiàng)。
不忽略隱藏文件。
在某些系統(tǒng)中,FileSystemWatcher 使用 8.3 短文件名格式報(bào)告文件更改。例如,對(duì)“LongFileName.LongExtension”的更改可能報(bào)告為“LongFi~.Lon”。
此類在應(yīng)用于所有成員的類級(jí)別上包含一個(gè)鏈接要求和一個(gè)繼承要求。如果直接調(diào)用方或派生類不具有完全信任權(quán)限,則會(huì)引發(fā) SecurityException。有關(guān)安全要求的詳細(xì)信息,請(qǐng)參見(jiàn) 鏈接要求。
復(fù)制和移動(dòng)文件夾
操作系統(tǒng)和 FileSystemWatcher 對(duì)象將剪切和粘貼操作或移動(dòng)操作解釋為對(duì)文件夾及其內(nèi)容的重命名操作。如果將包含文件的文件夾剪切并粘貼到受監(jiān)視的文件夾中,則 FileSystemWatcher 對(duì)象僅將文件夾報(bào)告為新建,但不能將其內(nèi)容報(bào)告為新建,因?yàn)閷?shí)際上只是對(duì)它們進(jìn)行了重命名。
若要接收已將文件夾內(nèi)容移動(dòng)或復(fù)制到受監(jiān)視的文件夾中的通知,請(qǐng)根據(jù)下表中的建議提供 OnChanged 和 OnRenamed 事件處理程序方法。
?
事件處理程序 | 已處理的事件 | 執(zhí)行 |
---|
OnChanged | Changed, Created, Deleted | 報(bào)告文件屬性的更改、創(chuàng)建的文件和刪除的文件。 |
OnRenamed | Renamed | 列出重命名的文件和文件夾的新舊路徑,需要時(shí)可以遞歸擴(kuò)展。 |
事件和緩沖區(qū)大小
請(qǐng)注意,有幾個(gè)因素可能影響引發(fā)哪些文件系統(tǒng)更改事件,如下所述:
公共文件系統(tǒng)操作可能會(huì)引發(fā)多個(gè)事件。例如,將文件從一個(gè)目錄移到另一個(gè)目錄時(shí),可能會(huì)引發(fā)若干 OnChanged 以及一些 OnCreated 和 OnDeleted 事件。移動(dòng)文件是一個(gè)包含多個(gè)簡(jiǎn)單操作的復(fù)雜操作,因此會(huì)引發(fā)多個(gè)事件。同樣,有些應(yīng)用程序(例如,防病毒軟件)可能會(huì)導(dǎo)致可由 FileSystemWatcher 檢測(cè)到的其他文件系統(tǒng)事件。
只要磁盤沒(méi)有切換或移除,FileSystemWatcher 就可監(jiān)視它們。因?yàn)?CD 和 DVD 的時(shí)間戳和屬性不能更改,所以 FileSystemWatcher 不為 CD 和 DVD 引發(fā)事件。要使該組件正常運(yùn)行,遠(yuǎn)程計(jì)算機(jī)必須具有所需的這些平臺(tái)之一。但是,無(wú)法從 Windows NT 4.0 計(jì)算機(jī)監(jiān)視遠(yuǎn)程 Windows NT 4.0 計(jì)算機(jī)。
在 Windows XP(Service Pack 1 之前版本)或者 Windows 2000 SP2 或更低版本中,如果多個(gè) FileSystemWatcher 對(duì)象正在監(jiān)視同一個(gè) UNC 路徑,則只有其中一個(gè)對(duì)象會(huì)引發(fā)事件。在運(yùn)行 Windows XP SP1 及之后版本、Windows 2000 SP3 或之后版本或者 Windows Server 2003 的計(jì)算機(jī)上,所有 FileSystemWatcher 對(duì)象都將引發(fā)相應(yīng)的事件。
設(shè)置 Filter 不會(huì)減少進(jìn)入緩沖區(qū)中的內(nèi)容。
請(qǐng)注意,由于 Windows 操作系統(tǒng)的依賴項(xiàng),當(dāng)丟失某個(gè)事件或超出緩沖區(qū)大小時(shí),FileSystemWatcher 不會(huì)引發(fā) Error 事件。若要防止丟失事件,請(qǐng)遵從這些準(zhǔn)則:
FileSystemWatcher 成員
公共構(gòu)造函數(shù)
公共事件下面的示例創(chuàng)建一個(gè)
FileSystemWatcher,以便在運(yùn)行時(shí)監(jiān)視指定的目錄。組件設(shè)置為監(jiān)視
LastWrite 和
LastAccess 時(shí)間方面的更改,以及目錄中文本文件的創(chuàng)建、刪除或重命名。如果更改、創(chuàng)建或刪除文件,文件路徑將被輸出到控制臺(tái)。在文件重命名后,舊路徑和新路徑都輸出到控制臺(tái)。
在此示例中使用 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
}