C#观察文件的更改

使用 FileSystemWatcher 可以监视文件的更改。事件在创建、重命名、删除和更改文件时触发。这可用于如下场景:需要对文件的变更做出反应,例如,服务器上传文件时,或文件缓存在内存中,而缓存需要在文件更改时失效。

因为 FileSystemWatcher 易于使用,所以下面直接开始一个示例。FileMonitor的示例代码利用以下名称空间:.

System 
System.IO

示例代码在 WatchFiles() 方法中开始观察文件。使用 FileSystemWatcher 的构造函数时,可以提供应该观察目录。还可以提供一个过滤器,只过滤出与过滤表达式匹配的特定文件。当设置属性 IncludeSubdirectories 时,可以定义是否应该只观察指定目录中的文件,或者是否还应该观察子目录中的文件。对于Created、Changed、 Deleted 和 Renamed 事件,提供事件处理程序。所有这些事件的类型都是 FileSystemEventHandler,只有 Renamed事件的类型是RenamedEventHandler。RenamedEventHandler 派生自 FileSystemEventHandler,提供了事件的附加信息:

private static FileSystemWatcher s_watcher;
public static void WatchFiles(string path, string filter) 
{ 
  s_watcher = new FileSystemWatcher(path, filter)
  {
    IncludeSubdirectories = true
  };
  s_watcher.Created += OnFileChanged; 
  s_watcher.Changed += OnFileChanged; 
  s_watcher.Deleted += OnFileChanged; 
  s_watcher.Renamed += OnFileRenamed; 
  s_watcher.EnableRaisingEvents = true;
  Console.WriteLine("watching file changes...");
}

因文件变更而接收到的信息是 FileSystemEventArgs 类型。它包含了变更文件的名字,这种变更是一个 WatcherChangeTypes 类型的枚举:

private static void OnFileChanged(object sender, FileSystemEventArgs e)
{
  Console.WriteLine($"file {e.Name} {e.ChangeType}");
}

重命名文件时,通过 RenamedEventArgs 参数收到其他信息。这个类型派生自FileSystemEventArgs,它定义了文件原始名称的额外信息:

private static void OnFileRenamed(object sender, RenamedEventArgs e) 
{
  Console.WriteLine($"file {e.OldName} {e.ChangeType} to {e.Name}");
}

指定要观察的文件夹和 *.txt 作为过滤器,启动应用程序,创建文件 samplel.txt,添加内容,把它重命名为 sample2.txt,最后删除它,输出如下。

watching file changes...
file New Text Document.txt Created
file New Text Document.txt Renamed to samplel.txt 
file samplel.txt Changed 
file samplel.txt Changed
file samplel.txt Renamed to sample2.txt 
file sample2.txt Deleted