我正在创建目录并在其上设置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
}
如何在不使目录卡住的情况下正确删除目录?
这似乎与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
}