System.IO.FileSystemWatcher 类

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

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

若要监视所有文件中的更改,请将Filter属性设置为空字符串(“”“)或使用 wild卡s(”*.*“)。 若要监视特定文件,请将 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~”。隆”。
  • 此类包含应用于所有成员的类级别的链接需求和继承需求。 当直接调用方或派生类没有完全信任权限时,将引发 A SecurityException 。 有关安全需求的详细信息,请参阅 链接需求
  • 可以为通过网络监视目录的属性设置InternalBufferSize的最大大小为 64 知识库(KB)。

复制和移动文件夹

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

若要通知文件夹的内容已移动或复制到监视文件夹中, OnChanged 请提供和 OnRenamed 事件处理程序方法,如下表所示。

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

事件和缓冲区大小

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

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

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

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