System.IO.FileSystemWatcher 类

本文提供了此 API 参考文档的补充说明。

用于 FileSystemWatcher 监视指定目录中的更改。 可以监视指定目录的文件和子目录中的更改。 可以创建一个组件来监视本地计算机、网络驱动器或远程计算机上的文件。

若要监视所有文件中的更改,请将 Filter 属性设置为空字符串(“”)或使用通配符(“*.*”)。 若要监视特定文件,请将 Filter 属性设置为文件名。 例如,若要监视文件 MyDoc.txt中的更改,请将 Filter 属性设置为“MyDoc.txt”。 还可以监视特定类型文件中的更改。 例如,若要监视文本文件中的更改,请将 Filter 属性设置为“*.txt”。

可以在目录或文件中监视多种类型的更改。 例如,您可以监控Attributes的变化、LastWrite日期和时间,或文件或目录的Size。 通过将 NotifyFilter 属性设置为 NotifyFilters 之一来完成此操作。 有关可监视的更改类型的详细信息,请参阅 NotifyFilters

可以监视文件或目录的重命名、删除或创建。 例如,若要监视文本文件的重命名,请将 Filter 属性设置为“*.txt”,并调用 WaitForChanged 方法,为其参数指定 Renamed

Windows操作系统会通过FileSystemWatcher创建的缓冲区通知您的组件文件发生的变更。 如果短时间内发生了许多更改,缓冲区可能会溢出。 这会导致组件失去对目录中的更改的跟踪,并且只会提供全面通知。 使用InternalBufferSize属性增加缓冲区的大小非常昂贵,因为它来自无法交换到磁盘的非分页内存,因此请将缓冲区保持在尽可能小的同时足够大,以确保不遗漏任何文件更改事件。 若要避免缓冲区溢出,请使用 NotifyFilterIncludeSubdirectories 属性,以便筛选掉不需要的更改通知。

有关实例 FileSystemWatcher的初始属性值列表,请参阅 FileSystemWatcher 构造函数。

使用 FileSystemWatcher 类时的注意事项:

  • 隐藏文件不会被忽略。
  • 在某些系统中, FileSystemWatcher 使用短 8.3 文件名格式报告对文件的更改。 例如,对“LongFileName.LongExtension”的更改可以报告为“LongFil~.Lon”。
  • 此类在应用于所有成员的类级别包含一个链接请求和一个继承请求。 当直接调用者或派生类没有完全信任权限时,将引起 SecurityException。 有关安全需求的详细信息,请参阅 链接需求
  • 您可以为通过网络监控目录的 InternalBufferSize 属性设置的最大大小是 64 KB。

复制和移动文件夹

操作系统和 FileSystemWatcher 对象将剪切-粘贴操作或移动操作解释为对文件夹及其内容的重命名操作。 如果将包含文件的文件夹剪切并粘贴到要监视的文件夹中,该 FileSystemWatcher 对象仅将文件夹报告为新文件夹,但不会报告其内容,因为它们实质上只是重命名。

若要接收到文件夹中的内容已移动或复制到监视文件夹的通知,请根据下表提供 OnChangedOnRenamed 事件处理程序方法。

事件处理程序 已处理的事件 执行速度
OnChanged ChangedCreatedDeleted 报告文件属性、已创建的文件和已删除文件中的更改。
OnRenamed Renamed 列出重命名的文件和文件夹的旧路径和新路径,根据需要以递归方式展开。

事件和缓冲区大小

请注意,几个因素可能会影响引发哪些文件系统更改事件,如下所述:

  • 常规的文件系统操作可能会引发多个事件。 例如,当文件从一个目录移动到另一个目录时,可能会产生多个OnChanged事件,以及一些OnCreatedOnDeleted事件。 移动文件是一项由多个简单操作组成的复杂操作,因此会引发多个事件。 同样,某些应用程序(例如防病毒软件)可能会导致其他文件系统事件被 FileSystemWatcher检测到。
  • 只要磁盘未切换或删除,FileSystemWatcher 就可以监视磁盘。 FileSystemWatcher 不会针对 CD 和 DVD 引发事件,因为时间戳和属性无法改变。 远程计算机必须安装一个必需的平台,组件才能正常运行。

请注意,当超出缓冲区大小时,FileSystemWatcher 可能会错过事件。 若要避免错过事件,请遵循以下准则:

  • 通过设置 InternalBufferSize 属性来增加缓冲区大小。
  • 避免监视具有长文件名的文件,因为长文件名有助于填充缓冲区。 请考虑使用较短的名称重命名这些文件。
  • 尽量缩短事件处理代码。