我有非常奇怪的行为.我有,
Directory.Delete(tempFolder, true);
if (Directory.Exists(tempFolder))
{
}
Run Code Online (Sandbox Code Playgroud)
有时Directory.Exists返回true.为什么?可能是探险家是开放的吗?
IIn*_*ble 20
Directory.Delete调用Windows API函数RemoveDirectory.观察到的行为记录在案:
该
RemoveDirectory函数在关闭时标记要删除的目录.因此,在关闭目录的最后一个句柄之前,不会删除该目录.
遗憾的是,.NET文档遗漏了这些信息.是否记录了静态Directory.Delete方法是否打开了目录句柄.同样,如果确实如此,则在手柄关闭时不会记录.
没有任何这些信息,您可以做的最好是轮询完成:
Directory.Delete(tempFolder, true);
while (Directory.Exists(tempFolder)) Thread.Sleep(0);
// At this point the directory has been removed from the filesystem
Run Code Online (Sandbox Code Playgroud)
尽管通常应该优先考虑轮询而不是事件,但是安装文件系统观察器对于这一点来说有点过头了.但请记住,此操作不是免费的,特别是在处理网络驱动器时.
但是,这些信息无助于找到比上述解决方案更好的解决方案(轮询完成).
GC.Collect()不运行终结器.这也似乎通过购买额外的时间来工作.
使用DirectoryInfo替代,并呼吁Refresh()这一点。
var dir = new DirectoryInfo(tempFolder);
dir.Delete();
dir.Refresh();
Run Code Online (Sandbox Code Playgroud)
因为我们正在对目录执行许多操作,所以使用DirectoryInfo而不是Directory. 这可能解释了为什么没有Refresh()静态类,它用于一次性操作,因此永远不需要刷新。
如果可能值得Thread.Sleep(0)在刷新后添加一个以放弃线程并将其放在池的后面。还没有测试过,这只是一个沉思。