FileSystemWatcher无法检测文件夹创建,请求技术帮助
解决FileSystemWatcher无法检测文件夹创建的问题
问题原因
代码存在两个关键问题导致无法捕获文件夹创建事件:
- NotifyFilters未包含DirectoryName:当前配置仅监控文件相关属性变化,目录的创建/修改需要通过
NotifyFilters.DirectoryName触发事件。 - Filter设置为空字符串:空字符串的Filter会让FileSystemWatcher仅匹配无扩展名的文件,而非所有文件和目录。
修复后的代码
using System; using System.IO; using System.Diagnostics; namespace fileSystemWatcherTest { class myClass { static void Main() { using var watcher = new FileSystemWatcher(@"C:\Users\Username\Desktop\Watching folder"); // 添加DirectoryName以监控目录变化 watcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.FileName | NotifyFilters.DirectoryName // 新增 | NotifyFilters.LastWrite; watcher.Changed += onChanged; watcher.Created += onCreated; watcher.Error += onError; // 将Filter改为*,匹配所有文件和目录 watcher.Filter = "*"; 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}"); string fileExtension = Path.GetExtension(e.FullPath); if (fileExtension != string.Empty) { Console.WriteLine(fileExtension); } } private static void onCreated(object sender, FileSystemEventArgs e) { // 区分创建的是文件还是目录 if (Directory.Exists(e.FullPath)) { Console.WriteLine($"Created Directory: {e.FullPath}"); } else { Console.WriteLine($"Created File: {e.FullPath}"); string fileExtension = Path.GetExtension(e.FullPath); if (!string.IsNullOrEmpty(fileExtension)) { Console.WriteLine($"Extension: {fileExtension}"); } } } private static void onError(object sender, ErrorEventArgs e) { printException(e.GetException()); } private static void printException(Exception ex) { if (ex != null) { Console.WriteLine("ERROR"); Console.WriteLine($"Message: {ex.Message}"); Console.WriteLine($"StackTrace:"); Console.WriteLine(ex.StackTrace); Console.WriteLine(""); printException(ex.InnerException); } } } }
额外说明
- 创建目录时
Created事件会触发,通过Directory.Exists(e.FullPath)可轻松区分是文件还是目录。 IncludeSubdirectories = true会监控目标文件夹下所有子目录的变化,不需要该功能可改为false。
内容的提问来源于stack exchange,提问作者iKingNinja
相关产品推荐
相关产品推荐

