侦听文件系统更改通知,并在目录或目录中的文件发生更改时引发事件。以下摘自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);
- }