C#: 用于使用 FileSystem Watcher 监视文件或目录的应用程序






4.75/5 (58投票s)
本文介绍了在 C# 中使用 FileSystemWatcher 对象监视文件或目录更改的情况

引言
在本文中,我描述了使用 C# 的 VS 2008 提供的 FileSystemWatcher
对象(注意:此对象与 VS 2005 中的对象相同)。这里创建的应用程序可用于监视您系统上的任何文件或目录。生成的更改列表包含有关文件/目录内容的创建、删除、更新或重命名的通知。
背景
.Net 提供的 FileSystemWatcher
对象是监视文件系统的一种有用方法。它的定义包含在 System.IO
命名空间中。该对象包含用于标记要监视的文件或目录的字段。此外,FileSystemWatcher
对象允许您使用通配符(例如 *.txt)监视目录中特定类型的文件。
使用代码
可以使用new
关键字创建 FileSystemWatcher
实例,如下所示m_Watcher = new System.IO.FileSystemWatcher();
然后我们需要为其分配一个路径和一个过滤器,以告诉该对象在哪里查找。
下面一行告诉监视器它必须继续查看 txtFile 文本框中输入的路径。末尾的 '\\' 字符是为了确保路径具有目录名称。否则,如果用户在文本框中输入类似“C:”的内容,将会出现问题。m_Watcher.Path = txtFile.Text + "\\";
接下来我们需要告诉监视器要查看什么。
下面一行告诉监视器它应该监视哪些文件。m_Watcher.Filter = strFilter;
strFilter
的值格式及其含义如下
*.* - 监视 Path 中的所有文件
*.ext - 监视具有扩展名 ext 的文件
name.ext - 监视特定的文件名 name.ext
请注意,当监视器开始监视时,文件 name.ext 可能不存在。但是,当文件被创建/移动到 Path 目录时,监视器会开始监视该文件。
接下来我们需要告诉监视器要查找什么。
下面一行使用各种标志精确地做到了这一点,每个标志描述了文件系统的某种属性。
m_Watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
我们还可以通过执行以下操作来告诉监视器监视我们指定在 Path 中的目录的子文件夹的更改。
m_Watcher.IncludeSubdirectories = true;
接下来我们需要描述当这些属性之一发生更改时需要做什么。
这是通过将不同的事件处理程序分配给不同的活动来完成的。在当前的应用程序中,我们对创建、更改和删除使用了相同的事件处理程序。这样做是因为我们只需要以相同的方式记录这些更改,并且更改名称是从事件处理程序中的参数中获取的。
m_Watcher.Changed += new FileSystemEventHandler(OnChanged); m_Watcher.Created += new FileSystemEventHandler(OnChanged); m_Watcher.Deleted += new FileSystemEventHandler(OnChanged); m_Watcher.Renamed += new RenamedEventHandler(OnRenamed);
请注意,Renamed 活动具有不同的处理程序。这是因为它对于其事件处理程序具有不同的签名。两个处理程序的签名如下所示。
void OnChanged(object sender, FileSystemEventArgs e) void OnRenamed(object sender, RenamedEventArgs e)
在这两种情况下,更改类型都可以从 e
参数中获取,作为 e.ChangeType
最后,我们需要告诉监视器去做它的工作 - 监视它!!!
这可以通过启用监视器来引发事件来完成。这通过以下行完成。
m_Watcher.EnableRaisingEvents = true;
完成后,监视器会继续监视指定的文件/文件或文件夹,并为其各自的活动引发相应的事件。
关注点
将 FileSystemWatcher 设置为监视文件或文件夹后,它将一直监视它,直到应用程序结束。将 m_Watcher
的值设置为 null
不会阻止其监视。要在应用程序仍在运行时停止监视器,我们需要阻止它引发事件。这可以通过以下方式完成。
m_Watcher.EnableRaisingEvents = false;
此应用程序的当前版本不适用于通过网络共享的网络驱动器或文件夹。我将在适当的时候发布具有此功能的代码。
历史
版本 1.0.0.0 上传于 2008 年 5 月 31 日
版本 1.0.0.1 上传于 2008 年 6 月 1 日