我有非常奇怪的行为。我有,
Directory.Delete(tempFolder, true);
if (Directory.Exists(tempFolder))
{
}
有时Directory.Exists返回true。为什么?可能是探险家开放了?
答案 0 :(得分:17)
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
尽管通常应该首先避免轮询而不是事件,但是安装文件系统观察器会有点过头了。但请记住,此操作不是免费的,特别是在处理网络驱动器时。
然而,这些信息无助于找到比上述更好的解决方案(轮询完成)。
GC.Collect()
不运行终结器。这也似乎可以通过购买额外的时间来实现。
答案 1 :(得分:5)
改为使用DirectoryInfo
,并在其上调用Refresh()
。
var dir = new DirectoryInfo(tempFolder);
dir.Delete();
dir.Refresh();
因为我们在目录上执行了许多操作,所以使用DirectoryInfo
而不是Directory
会更高效。这可能解释了为什么静态类上没有Refresh()
,它意味着一次性操作,因此永远不需要刷新。