【发布时间】:2016-10-12 19:51:28
【问题描述】:
我将删除一个目录(如果存在),然后重新创建该目录。
我的代码是这样的:
if (Directory.Exists(destFolder))
{
Directory.Delete(destFolder, true);
DirectoryInfo dirInfo = Directory.CreateDirectory(destFolder);
}
else
{
Directory.CreateDirectory(destFolder);
}
我面临的问题是:如果目录已经包含文件并且该目录当前在 Windows 资源管理器窗口之一中打开(即使任何应用程序中都没有打开文件),那么:
- Directory.Delete 删除目录,资源管理器窗口自动导航到父文件夹。
- CreateDirectory 不会抛出任何错误,但它返回的 DirectoryInfo 包含 Exists 为 false。
因此,稍后在我的程序中,当我尝试在该目录中创建文件时,出现错误:“找不到路径的一部分”
为什么会出现这种行为以及解决方案是什么?
谢谢。
编辑 1: 有时 DirectoryInfo.Exists 返回 true,但目录实际上并不存在于资源管理器中!
【问题讨论】:
-
在我的测试中 Directory.Exist 和 DirectoryInfo.Exist 在删除并重新创建后返回 true。
-
检查我上面的编辑。即使 Exists = true,您能否验证 Directory 是否确实已创建?您是否确保该目录有文件,并且该目录已在资源管理器窗口之一中打开?
-
我之前放了Thread.Sleep(100),效果很好。
-
此文件夹是否有只读文件?
-
很多程序都喜欢打开目录的句柄。最常见的原因是这样的程序使用了 FileSystemWatcher 的等价物(就像 Explorer 一样)。或者因为目录是程序的Environment.CurrentDirectory。该句柄以 FileShare.Delete 的等效项打开。换句话说,删除工作正常,但在所有句柄关闭之前它实际上不会消失。后一个子句是问题所在, CreateDirectory() 在此之前无法成功。这需要多长时间是完全无法预测的。您可以重命名该目录或将其移至回收站。