16.12 以编程方式“观察”文件
现在知道了各种读取器和编写器的使用,下面看看FileSystemWatcher类的作用。当我们想编程监控(或者观察)系统上的文件的时候,这个类就非常有用。特别的是,我们能通过NotifyFilters枚举来决定需要FileSystemWatcher监控文件的行为(大多数成员都能通过字面了解其含义,详细信息请参考在线帮助):
public enum System.IO.NotifyFilters
{
Attributes, CreationTime,
DirectoryName, FileName,
LastAccess, LastWrite,
Security, Size,
}
使用FileSystemWatcher类型的第一步是设置Path属性,以指定需要监控的文件所在文件夹的名字(或者位置),还有就是定义需要监控文件的扩展名的Filter属性。
至此,我们可以选择使用FileSystemEventHandler委托关联的事件来实现Changed、Created和Deleted事件的处理方法。这个委托可以调用任何符合下列模式的方法:
// FileSystemEventHandler委托必须指向符合下列签名的方法。
void MyNotificationHandler(object source, FileSystemEventArgs e)
同样,重命名事件也可以通过RenamedEventHandler委托类型来处理,调用的方法必须符合下列签名:
// RenamedEventHandler委托必须指向符合下列签名的方法。
void MyNotificationHandler(object source, RenamedEventArgs e)
为了演示观察文件的过程,假设我们已经在C盘新建了一个名为MyFolder的目录,其中包含了各种*.txt文件(什么名字都可以)。下面这个控制台应用程序将会监控这些MyFolder下的*.txt文件,并显示出文件的建立、删除、修改和重命名事件的消息。
static void Main(string[] args)
{
Console.WriteLine("***** The Amazing File Watcher App *****\n");
// 确定指向要观察的目录的路径。
FileSystemWatcher watcher = new FileSystemWatcher();
try{
watcher.Path = @"C:\MyFolder";
}
catch(ArgumentException ex) {
Console.WriteLine(ex.Message);
return;
}
// 设置需要“留意”的事情。
watcher.NotifyFilter = NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.FileName
| NotifyFilters.DirectoryName;
// 只观察文本文件。
watcher.Filter = "*.txt";
// 增加事件处理程序。
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
// 开始观察目录。
watcher.EnableRaisingEvents = true;
// 等待用户退出程序。
Console.WriteLine(@"Press 'q' to quit app.");
while(Console.Read()!='q');
}
这两个事件处理程序输出了当前文件的修改:
static void OnChanged(object source, FileSystemEventArgs e)
{
// 指定当文件改变、创建或者删除的时候需要做的行为。
Console.WriteLine("File: {0} {1}!", e.FullPath, e.ChangeType);
}
static void OnRenamed(object source, RenamedEventArgs e)
{
// 指定当文件重命名的时候需要做的行为。
Console.WriteLine("File: {0} renamed to\n{1}", e.OldFullPath, e.FullPath);
}
为了测试该程序,运行应用程序并且打开Windows资源管理器。试着重命名文件、新建一个*.txt文件、删除一个*.txt文件等,我们就会看到这个控制台应用程序输出了各种关于MyFolder文件夹内文本文件当前状态的信息。

图16-10 观察一些文本文件
源代码 MyDirectoryWatcher项目的源代码位于Chapter 16子目录下。






