C# 如果删除了监视的文件夹,则不会引发FileSystemWatcher错误事件,但仅当监视的文件夹中包含文件时才会引发

C# 如果删除了监视的文件夹,则不会引发FileSystemWatcher错误事件,但仅当监视的文件夹中包含文件时才会引发,c#,filesystemwatcher,C#,Filesystemwatcher,我将FileSystemWatcher用于其通常用途。然而,当我发现一个特殊的问题时,我正在测试它的错误事件的使用 如果我将FSW设置为监视给定的空的文件夹并将其设置为运行,如果我删除该文件夹,FSW将引发错误事件,并在异常中显示“拒绝访问”消息 如果我重新创建文件夹并将一个文件放在一边(如文本文件),然后再次运行测试应用程序,如果我这次删除文件夹,则不会引发错误事件 这让我很困惑。有人知道为什么会这样吗。我有种感觉,我在做一些愚蠢的错事 所以问题的总结是: 删除空的监视文件夹:引发FSW错误

我将FileSystemWatcher用于其通常用途。然而,当我发现一个特殊的问题时,我正在测试它的错误事件的使用

如果我将FSW设置为监视给定的空的文件夹并将其设置为运行,如果我删除该文件夹,FSW将引发错误事件,并在异常中显示“拒绝访问”消息

如果我重新创建文件夹并将一个文件放在一边(如文本文件),然后再次运行测试应用程序,如果我这次删除文件夹,则不会引发错误事件

这让我很困惑。有人知道为什么会这样吗。我有种感觉,我在做一些愚蠢的错事

所以问题的总结是:

  • 删除空的监视文件夹:引发FSW错误事件
  • 删除非空的监视文件夹:未引发FSW错误事件
以下是测试控制台应用程序的代码

class Program
{
    static WatcherTests tests;
    static void Main(string[] args)
    {
        InitialiseWatcher();
        Console.ReadLine();
    }

    private static void InitialiseWatcher()
    {
        tests = new WatcherTests();
        tests.InitialiseWatcher();
    }
}

class WatcherTests
{
    FileSystemWatcher _watcher;

    internal void InitialiseWatcher()
    {
        _watcher = new FileSystemWatcher();
        _watcher.Changed += OnWatcher_Changed;
        _watcher.Created += OnWatcher_Created;
        _watcher.Deleted += OnWatcher_Deleted;
        _watcher.Error += OnWatcher_Error;
        _watcher.IncludeSubdirectories = false;
        _watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite;
        _watcher.Path = @"c:\temp\testwatcher";
        _watcher.EnableRaisingEvents = true;
    }

    private void OnWatcher_Error(object sender, ErrorEventArgs e)
    {
        Console.WriteLine($"Watcher_Error {e.GetException().Message}");
    }

    private void OnWatcher_Deleted(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine($"Watcher_Deleted {e.Name}");
    }

    private void OnWatcher_Created(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine($"Watcher_Created {e.Name}");
    }

    private void OnWatcher_Changed(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine($"Watcher_Changed {e.Name}");
    }
}

我只做了你描述的事情,得到了两个事件——文件删除事件和错误事件。(我尝试过循环使用-无事件。尝试过没有循环使用-shift+delete-并再次获得这两个事件)。是的,我可以确认这一行为,嗯。所以你认为FSW在这方面存在问题?我认为更可能的是,我们的环境存在一些不同的东西,导致其行为不同。这当然很奇怪。我现在正在研究这一点,这可能是预期的行为,因为进入回收站的文件实际上没有被删除-仍然不确定为什么这会导致错误事件不会发生,由于该文件夹不再可访问。但也不会删除该文件夹-如果您还原该文件夹,然后执行硬删除,则会引发错误事件。我不确定FSW在内部是如何工作的,它是挂接Windows内部事件,还是定期轮询更改。如果是前者,那么我猜删除到回收站不会发布已删除的事件。