FileSystemWatcher类的主要功能: 监控指定文件或目录的文件的创建、删除、改动、重命名等活动。可以动态地定义需要监控的文件类型及文件属性改动的类型。 具体可以参考微软官方文档FileSystemWatcher Namespace: System.IO Assembly: System.dll Listens to the file system change notifications and raises events when a directory, or file in a directory, changes.
使用FileSystemWatcher可以监视文件的更改。事件在创建、重命名、删除和更改文件时触发。这可用于如下场景:需要对文件的变更作出反应。例如,服务器上传文件时,或文件缓存在内存中,而缓存需要在文件更改时失效。 下面是一个FileMonitor的示例程序:
using System;
using System.IO;
namespace FileMonitor
{
public class Program
{
private static FileSystemWatcher s_watcher;
public static void Main(string[] args)
{
WatchFiles(".", "*.txt");
Console.ReadLine();
UnWatchFiles();
}
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...");
}
public static void UnWatchFiles()
{
s_watcher.Created -= OnFileChanged;
s_watcher.Changed -= OnFileChanged;
s_watcher.Deleted -= OnFileChanged;
s_watcher.Renamed -= OnFileRenamed;
s_watcher.Dispose();
s_watcher = null;
}
private static void OnFileRenamed(object sender, RenamedEventArgs e) =>
Console.WriteLine($"file {e.OldName} {e.ChangeType} to {e.Name}");
private static void OnFileChanged(object sender, FileSystemEventArgs e) =>
Console.WriteLine($"file {e.Name} {e.ChangeType}");
}
}
The following example creates a FileSystemWatcher to watch the directory specified at run time. The component is set to watch for changes in LastWrite and LastAccess time, the creation, deletion, or renaming of text files in the directory. If a file is changed, created, or deleted, the path to the file prints to the console. When a file is renamed, the old and new paths print to the console.
using System;
using System.IO;
using System.Security.Permissions;
public class Watcher
{
public static void Main()
{
Run();
}
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
private static void Run()
{
string[] args = Environment.GetCommandLineArgs();
// If a directory is not specified, exit program.
if (args.Length != 2)
{
// Display the proper way to call the program.
Console.WriteLine("Usage: Watcher.exe (directory)");
return;
}
// Create a new FileSystemWatcher and set its properties.
using (FileSystemWatcher watcher = new FileSystemWatcher())
{
watcher.Path = args[1];
// Watch for changes in LastAccess and LastWrite times, and
// the renaming of files or directories.
watcher.NotifyFilter = NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.FileName
| NotifyFilters.DirectoryName;
// Only watch text files.
watcher.Filter = "*.txt";
// Add event handlers.
watcher.Changed += OnChanged;
watcher.Created += OnChanged;
watcher.Deleted += OnChanged;
watcher.Renamed += OnRenamed;
// Begin watching.
watcher.EnableRaisingEvents = true;
// Wait for the user to quit the program.
Console.WriteLine("Press 'q' to quit the sample.");
while (Console.Read() != 'q') ;
}
}
// Define the event handlers.
private static void OnChanged(object source, FileSystemEventArgs e) =>
// Specify what is done when a file is changed, created, or deleted.
Console.WriteLine($"File: {e.FullPath} {e.ChangeType}");
private static void OnRenamed(object source, RenamedEventArgs e) =>
// Specify what is done when a file is renamed.
Console.WriteLine($"File: {e.OldFullPath} renamed to {e.FullPath}");
}