FileSystemWatcher
是常用的文件监视方法,其简单示例如下:
using System;
using System.IO;
namespace MyNamespace
{
class MyClassCS
{
static void Main()
{
using var watcher = new FileSystemWatcher(@"C:\path\to\folder");
watcher.NotifyFilter = NotifyFilters.Attributes
| NotifyFilters.CreationTime
| NotifyFilters.DirectoryName
| NotifyFilters.FileName
| NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.Security
| NotifyFilters.Size;
watcher.Changed += OnChanged;
watcher.Created += OnCreated;
watcher.Deleted += OnDeleted;
watcher.Renamed += OnRenamed;
watcher.Error += OnError;
watcher.Filter = "*.txt";
watcher.IncludeSubdirectories = true;
watcher.EnableRaisingEvents = true;
Console.WriteLine("Press enter to exit.");
Console.ReadLine();
}
private static void OnChanged(object sender, FileSystemEventArgs e)
{
if (e.ChangeType != WatcherChangeTypes.Changed)
{
return;
}
Console.WriteLine($"Changed: {e.FullPath}");
}
private static void OnCreated(object sender, FileSystemEventArgs e)
{
string value = $"Created: {e.FullPath}";
Console.WriteLine(value);
}
private static void OnDeleted(object sender, FileSystemEventArgs e) =>
Console.WriteLine($"Deleted: {e.FullPath}");
private static void OnRenamed(object sender, RenamedEventArgs e)
{
Console.WriteLine($"Renamed:");
Console.WriteLine($" Old: {e.OldFullPath}");
Console.WriteLine($" New: {e.FullPath}");
}
private static void OnError(object sender, ErrorEventArgs e) =>
PrintException(e.GetException());
private static void PrintException(Exception? ex)
{
if (ex != null)
{
Console.WriteLine($"Message: {ex.Message}");
Console.WriteLine("Stacktrace:");
Console.WriteLine(ex.StackTrace);
Console.WriteLine();
PrintException(ex.InnerException);
}
}
}
}
但是对于需要进行动态更新路径的需求,需要FileSystemWatcher
更新监视路径,对此可以将监视路径的更改封装在一个方法中,并在触发条件满足时调用该方法。下面是一个简单的示例,演示如何在监视路径更新后重新设置FileSystemWatcher
:
using System;
using System.IO;
class Program
{
static FileSystemWatcher watcher = new FileSystemWatcher();
static void Main()
{
// 初始监视路径
string initialPath = @"C:\path\to\directory";
SetWatcher(initialPath);
// 模拟条件触发,改变监视路径
Console.WriteLine("Press 'c' to change the directory, 'q' to quit.");
while (true)
{
var key = Console.ReadKey().KeyChar;
if (key == 'q')
break;
else if (key == 'c')
{
Console.WriteLine("\nChanging directory...");
string newPath = @"C:\new\path\to\directory"; // 新的监视路径
SetWatcher(newPath);
}
}
}
static void SetWatcher(string path)
{
if (watcher.EnableRaisingEvents)
{
watcher.EnableRaisingEvents = false;
watcher.Dispose();
watcher = new FileSystemWatcher();
}
watcher.Path = path;
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "*.*"; // 监视所有文件
watcher.IncludeSubdirectories = true; // 包括子目录
// 添加事件处理程序
watcher.Changed += OnChanged;
watcher.Created += OnCreated;
watcher.Deleted += OnDeleted;
watcher.Renamed += OnRenamed;
// 开始监视
watcher.EnableRaisingEvents = true;
Console.WriteLine($"Now watching: {path}");
}
// 文件或目录更改事件处理程序
private static void OnChanged(object source, FileSystemEventArgs e)
{
Console.WriteLine($"File: {e.FullPath} {e.ChangeType}");
}
// 文件或目录创建事件处理程序
private static void OnCreated(object source, FileSystemEventArgs e)
{
Console.WriteLine($"File: {e.FullPath} {e.ChangeType}");
}
// 文件或目录删除事件处理程序
private static void OnDeleted(object source, FileSystemEventArgs e)
{
Console.WriteLine($"File: {e.FullPath} {e.ChangeType}");
}
// 文件或目录重命名事件处理程序
private static void OnRenamed(object source, RenamedEventArgs e)
{
Console.WriteLine($"File: {e.OldFullPath} renamed to {e.FullPath}");
}
}
在这个示例中,当用户按下'c'
键时,会调用SetWatcher
方法来更新监视路径。可以根据你的实际需求来替换触发条件和新路径。