侦听文件系统更改通知,并在目录或目录中的文件发生更改时引发事件。
命名空间:System.IO
程序集:System(在 system.dll 中)
继承层次结构
C# 用法:
1public 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# 事例:
1public 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}