C# 的 FileSystemWatcher 类是一种监控文件变化的工具,允许我们监控一个特定的文件或者目录中的任一更改,比如内容修改、新增、删除等行为。下面,我将详细讲解 FileSystemWatcher 的使用方法,并附带两个示例说明。
前置条件
在使用 FileSystemWatcher 类之前,需要先引入 System.IO 命名空间,以便于访问所需的类和方法。
using System.IO;
监控目录的变化
在应用程序中,可以使用下面的代码来监控目录的变化,包括文件的创建、修改和删除等操作:
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = "C:\\test";
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "*.txt";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnCreated);
watcher.Deleted += new FileSystemEventHandler(OnDeleted);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
watcher.EnableRaisingEvents = true;
上述代码创建了一个 FileSystemWatcher 的实例对象,并将监控的目录设置为 "C:\test"。使用 NotifyFilter 属性指定要监控的事件类型,这里包括文件的最后访问时间、最后修改时间、文件名以及目录名。Filter 属性用于指定要监视的文件类型,例如 "*.txt" 表示监控所有的文本文件类型。
另外,使用上述代码还定义了四个事件处理程序,分别对应于文件变化、创建、删除和重命名。例如,OnChanged 方法用于处理文件被修改的事件:
private static void OnChanged(object source, FileSystemEventArgs e)
{
Console.WriteLine($"File: {e.FullPath} {e.ChangeType}");
}
在事件处理程序中,可以对文件的变化做出相应的处理操作。最后,将 EnableRaisingEvents 属性设置为 true,以启动 FileSystemWatcher 监控。
监控文件的变化
除了监控整个目录以外,还可以仅仅监控单个文件的变化,操作方法如下:
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = "C:\\test\\test.txt";
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "test.txt";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
上述代码中,创建了一个 FileSystemWatcher 的实例对象,并用 Path 属性指定要监控的文件路径。其余属性配置与之前的示例类似。需要注意,这种监控方式只能监控单个文件,不能监控整个目录内的文件变化。
示例说明
下面,我们将使用两个示例来进一步说明 FileSystemWatcher 的用法。
示例一:监控文件内容的变化
假设我们要监控一个文本文件,当其中的内容有变化时,将修改后的内容输出到命令行中。可以使用下面的代码实现:
static void Main(string[] args)
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = ".";
watcher.Filter = "test.txt";
watcher.NotifyFilter = NotifyFilters.LastWrite;
watcher.Changed += new FileSystemEventHandler(OnChanged);
Console.WriteLine("Starting to monitor changes...");
watcher.EnableRaisingEvents = true;
Console.ReadKey();
}
private static void OnChanged(object sender, FileSystemEventArgs e)
{
// wait for the file to be released
while (IsFileLocked(e.FullPath))
{
Thread.Sleep(500);
}
// read the file content
string content = string.Empty;
try
{
content = File.ReadAllText(e.FullPath);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Console.WriteLine(content);
}
// check if the file is locked or not
public static bool IsFileLocked(string filePath)
{
FileStream stream = null;
try
{
stream = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (IOException)
{
return true;
}
finally
{
if (stream != null)
{
stream.Close();
}
}
return false;
}
上述代码监视了当前目录下的 test.txt 文件,当其内容被修改时,将修改后的内容输出到命令行。在 OnChanged 方法中,使用 File.ReadAllText 方法读取文件内容,需要注意的是,在文件被编辑的过程中,该文件可能会被锁定,导致读取失败,因此可以使用一个 IsFileLocked 方法来检查文件是否被锁定,并在文件被释放之后再读取。
示例二:监控多个文件夹和文件
假设我们要监控多个文件夹和文件的变化,当其中任意一个文件或文件夹内的内容发生变化时,都可以及时地收到通知。可以使用如下代码实现:
static void Main(string[] args)
{
FileSystemWatcher dirWatcher = new FileSystemWatcher();
dirWatcher.Path = @"C:\test";
dirWatcher.IncludeSubdirectories = true;
dirWatcher.NotifyFilter = NotifyFilters.LastWrite;
dirWatcher.Changed += new FileSystemEventHandler(OnDirChanged);
dirWatcher.Created += new FileSystemEventHandler(OnDirChanged);
dirWatcher.EnableRaisingEvents = true;
FileSystemWatcher fileWatcher = new FileSystemWatcher();
fileWatcher.Path = @"C:\test\test.txt";
fileWatcher.NotifyFilter = NotifyFilters.LastWrite;
fileWatcher.Changed += new FileSystemEventHandler(OnFileChanged);
fileWatcher.EnableRaisingEvents = true;
Console.WriteLine("Starting to monitor changes...");
Console.ReadKey();
}
private static void OnDirChanged(object sender, FileSystemEventArgs e)
{
Console.WriteLine($"Directory: {e.FullPath} {e.ChangeType}");
}
private static void OnFileChanged(object sender, FileSystemEventArgs e)
{
Console.WriteLine($"File: {e.FullPath} {e.ChangeType}");
}
上述代码监视了 C:\test 目录及其子目录下的所有文件和文件夹,以及 C:\test\test.txt 文件。当这些文件或文件夹的内容发生变化时,都将触发相应的事件处理程序,并输出对应的变化信息。
注:以上示例中的代码只是对 FileSystemWatcher 类的部分用法的说明,实际应用和使用场景会更为复杂,需要根据具体需求进行调整和完善。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#的FileSystemWatcher用法实例详解 - Python技术站