带递归的Directory.Delete随机失败,说“目录不为空”

时间:2011-07-05 17:11:11

标签: c# exception

我有一个暂存目录,如果在我的脚本中使用它,我想清理它。代码很简单:

if (Directory.Exists(_stagingDir) &&
    Directory.EnumerateFileSystemEntries(_stagingDir).Any())
{
    Directory.Delete(_stagingDir, true);
}

有时,它失败并出现“目录不为空”的IO异常。如果我递归删除里面的所有项目(这是true应该在该函数中做什么),那不应该没关系吗?如果我将脚本备份几行并再次运行它,它可以正常工作。

我唯一的猜测是EnumerateFileSystemEntries正在锁定文件,但我猜想我会得到一个非常不同的例外(“拒绝访问”或“文件锁定”或其他内容)。

1 个答案:

答案 0 :(得分:1)

为什么要打扰EnumerateFileSystemEntries呢?如果这是您的问题的原因,那么只需简化为:

if (Directory.Exists(_stagingDir))
{
    Directory.Delete(_stagingDir, true);
}

我怀疑你收到此错误的原因是EnumerateFileSystemEntries返回的枚举在你调用Delete()时没有被释放,这意味着它对文件系统条目的处理是还开着。您可以using重写此问题以解决问题,但如上所示,您最好完全删除多余的调用。