为什么以下Directory.Delete抛出IOException该目录不为空

问题描述 投票:0回答:1

我正在创建目录并在其上设置FileSystemWatcher。然后我创建一个文件。所有这些都是在表单构造函数中完成的。在按钮事件处理程序中,我删除上面创建的目录。有时会抛出IOException:目录不为空。此后,我什至无法访问资源管理器中的子目录。我不断收到“访问被拒绝错误”。我的进程退出后,该目录将被删除。AFAIK FileSystemWatcher不应锁定目录。


        string alphaBeta = @"Alpha\Beta";
        public Form1()
        {
            InitializeComponent();
            Directory.CreateDirectory(alphaBeta);
            FileSystemWatcher watcher = new FileSystemWatcher()
            {
                Path = alphaBeta,
                Filter = "*.dat",
                NotifyFilter = NotifyFilters.FileName
            };
            watcher.EnableRaisingEvents = true;
            File.WriteAllText(alphaBeta + @"\Gamma.dat", "Delta");
        }

        private void btnDelete_Click(object sender, EventArgs e)
        {
            Directory.Delete("Alpha", true);//Recursively Delete
        }

如何在不使目录卡住的情况下正确删除目录?

c# delete-file ioexception filesystemwatcher
1个回答
0
投票

这似乎与FileSystemWatcher有关。如果为此代码注释掉,则不会发生异常。

似乎在调用FileSystemWatcher方法之前不一定要放置Directory.Delete

[以适当的方式处理FileSystemWatcher以使其在删除可能依赖的资源之前被处理掉是适当的,但是在您的示例代码中,只需添加watcher.Dispose();即可轻松实现:

string alphaBeta = @"Alpha\Beta";
public Form1()
{
    InitializeComponent();
    Directory.CreateDirectory(alphaBeta);
    FileSystemWatcher watcher = new FileSystemWatcher()
    {
        Path = alphaBeta,
        Filter = "*.dat",
        NotifyFilter = NotifyFilters.FileName
    };
    watcher.EnableRaisingEvents = true;
    watcher.Dispose();
    File.WriteAllText(alphaBeta + @"\Gamma.dat", "Delta");
}

private void button1_Click(object sender, EventArgs e)
{

    Directory.Delete("Alpha", true);//Recursively Delete
}
© www.soinside.com 2019 - 2024. All rights reserved.