You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 08:09:17