C# Directory.Delete()与.Create()是否同步?

C# Directory.Delete()与.Create()是否同步?,c#,.net,C#,.net,第三行是在删除目录后还是在删除目录时执行?我是否必须将第一个命令放入“任务”并等待它完成?这是一个较老的问题,但值得注意-目录。Delete最终调用removeddirectoryWindows函数,该函数将目录标记为要删除,但在关闭所有文件句柄()之前,文件系统实际上不会删除它。因此,完全有可能从目录返回。删除并发现该目录仍然存在。在运行一些使用文件系统的集成测试时,我也间歇性地遇到了这个问题 我想要的“完整”操作是获取一个空文件夹,我的进程可以在其中执行操作。由于以前的测试运行,该文件夹可能

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

这是一个较老的问题,但值得注意-
目录。Delete
最终调用
removeddirectory
Windows函数,该函数将目录标记为要删除,但在关闭所有文件句柄()之前,文件系统实际上不会删除它。因此,完全有可能从
目录返回。删除
并发现该目录仍然存在。

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

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

考虑到这一点,我意识到这是一块真正腐朽的木板,可以用来建造这一行动

所以我现在用这个:

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

我还在
目录中提交了一个建议。删除
doc页面,添加一些关于该方法的底层异步性质的注释(我想至少在Windows上是这样)。就泄漏的抽象而言,这是一个相当大的泄漏。

C#本质上是同步的。也许你对.NET中有关异步的所有新内容有点困惑。还有:我想否决票的原因是,您在代码示例中将问题表述为注释。@bvgheluwe我真的有点困惑,我想这是因为我最近在后台工作人员中做了一些事情,而且是异步的,我必须为特定代码创建一个任务,并等待它完成。有时候我觉得太复杂了,我想。@goodeinstein,你不明白吗?o、 o我有一个问题:)这个问题很好,它只是有一个奇怪的标题和一些糟糕的格式。不知道为什么人们会投反对票,而不是做一些简单的编辑或改进建议。现在编辑完成了,问题看起来很好,结果是-3,而且没有明显的理由进行了离题投票。@Andersforgren我从一个叫schmaedeck的人那里得到了一些建议。现在一切都好了,我想:)谢谢你,我感谢你的最新答案:)附加:
while(Directory.Exists(“someFolder”))Thread.Sleep(100)
删除
之后,但在
创建
之前对我起作用。我注意到创建文件夹时出现的问题,由于文件系统延迟,导致单元测试偶尔失败。我将Refresh()添加到我正在使用的DirectoryInfo对象中,并修复了它。>
while(Directory.Exists(“someFolder”))Thread.Sleep(100)如果出现问题,您将永远循环。。。请使用具有固定迭代次数的for循环,如果所有尝试失败,则抛出异常。您可能需要考虑重命名该目录,然后删除它;对于异步没有同样的警告,所以这可能是一种可靠的同步删除方式。对每个
子目录
?@mxflime进行递归调用不是更好吗?出于我的目的,不。我不想保留现有的文件夹结构。但是这个目标没有错。调整这一逻辑以实现这一点应该非常简单。
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;
}