FileSystemWatcher是.NET中用于监听文件夹变化的高效类,通过设置Path、NotifyFilter等属性并绑定事件可监控文件的创建、修改、删除和重命名操作。需注意配置IncludeSubdirectories以递归监听子目录,合理调整InternalBufferSize防止事件丢失,并处理重复触发、文件占用等问题。封装为服务类便于复用,适用于日志监控、自动备份等场景。

要实现对一个文件夹的监听,.NET 提供了内置的 FileSystemWatcher 类,可以高效地监控目录中的文件创建、删除、修改和重命名等操作。以下是具体实现方案和注意事项。
1. 使用 FileSystemWatcher 基础实现
通过 FileSystemWatcher 可以监听指定路径下的文件变化。基本用法如下:
var watcher = new FileSystemWatcher();
watcher.Path = @"C:\YourFolder"; // 监听的目录
watcher.NotifyFilter = NotifyFilters.LastWrite
| NotifyFilters.FileName
| NotifyFilters.DirectoryName;
watcher.Filter = "*.*"; // 监听所有文件
// 绑定事件
watcher.Changed += OnChanged;
watcher.Created += OnCreated;
watcher.Deleted += OnDeleted;
watcher.Renamed += OnRenamed;
// 开始监听
watcher.EnableRaisingEvents = true;
其中事件处理函数示例:
private static void OnChanged(object source, FileSystemEventArgs e)
{
Console.WriteLine($"文件 {e.FullPath} 被修改");
}
private static void OnCreated(object source, FileSystemEventArgs e)
{
Console.WriteLine($"文件 {e.FullPath} 被创建");
}
private static void OnDeleted(object source, FileSystemEventArgs e)
{
Console.WriteLine($"文件 {e.FullPath} 被删除");
}
private static void OnRenamed(object source, RenamedEventArgs e)
{
Console.WriteLine($"文件从 {e.OldFullPath} 重命名为 {e.FullPath}");
}
2. 关键配置项说明
合理设置参数可避免误报或漏报:
- Path:必须确保目录存在,否则会抛出异常。
- IncludeSubdirectories:设为 true 可递归监听子目录。
- NotifyFilter:可根据需求选择监控属性(如大小、时间、名称等)。
- InternalBufferSize:默认 8KB,高频率操作建议增大至 32KB 或更高,防止事件丢失。
- SynchronizingObject:若在 WinForms/WPF 中使用,需设置以正确触发 UI 更新。
3. 处理常见问题
实际使用中可能遇到的问题及应对方式:
- 重复触发:某些编辑器保存文件时会触发多次事件。可通过延迟去重(如 Timer 缓冲)处理。
- 文件被占用:在 Created 事件中立即读取文件可能失败。建议延时或捕获 IOException 重试。
- 网络路径不稳定:监控远程共享文件夹时,建议增加错误重连机制。
- 权限不足:确保运行程序的账户有目标目录的读取和遍历权限。
4. 完整封装示例
将监听逻辑封装成服务类更便于复用:
public class FolderMonitor : IDisposable
{
private FileSystemWatcher _watcher;
public void Start(string path)
{
_watcher = new FileSystemWatcher(path)
{
IncludeSubdirectories = true,
NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite,
Filter = "*.*"
};
_watcher.Changed += (s, e) => Console.WriteLine($"修改: {e.FullPath}");
_watcher.Created += (s, e) => Console.WriteLine($"创建: {e.FullPath}");
_watcher.EnableRaisingEvents = true;
}
public void Dispose()
{
_watcher?.Dispose();
}
}
使用时:
using var monitor = new FolderMonitor(); monitor.Start(@"C:\Test"); Console.ReadLine(); // 保持运行基本上就这些。FileSystemWatcher 是 .NET 中最直接且高效的文件夹监听方案,合理配置后可稳定用于日志监控、自动备份、热加载等场景。










