Directory.Delete()/ .Create()是同步的吗?

时间:2016-01-24 20:36:42

标签: c# .net

using System.IO;
Directory.Delete("someFolder",true);
Directory.Create("someFolder");

删除目录或删除目录后是否会执行第三行?我是否必须将第一个命令放入“任务”并等待它完成?

2 个答案:

答案 0 :(得分:14)

这是一个较旧的问题,但值得注意 - Directory.Delete最终调用RemoveDirectory Windows函数,其中标记目录为待删除,但文件系统赢了't 实际上将其删除,直到所有文件句柄都关闭(see docs)。因此,完全可以从Directory.Delete返回并找到目录仍然存在。

答案 1 :(得分:0)

在运行一些使用文件系统的集成测试时,我也间歇性地遇到了这个问题。

我想要的“完整”操作是获得一个空文件夹,我的进程可以在其中执行其操作。由于以前的测试运行,该文件夹可能已经存在(带有内容),或者如果(a)是新克隆的仓库或(b)我正在添加新的测试用例,则该文件夹可能不存在。

有了Doug's illuminating answer,我意识到Directory.Delete是在其上进行此操作的真正烂木板。

所以我现在使用这个:

public static DirectoryInfo EmptyDirectory(string directoryPath)
{
    var directory = Directory.CreateDirectory(directoryPath);

    foreach (var file in directory.EnumerateFiles())
    {
        file.Delete();
    }

    foreach (var subdirectory in directory.EnumerateDirectories())
    {
        subdirectory.Delete(true);
    }

    return directory;
}

我还在Directory.Delete文档页面上提出了一条建议,以添加关于该方法的潜在异步特性的某种注释(我想至少是在Windows上)。就泄漏抽象而言,这是一个很大的泄漏。