DirectoryInfo无法创建目录。

3

这可能是一些愚蠢的事情,但我就是看不出来。所以我有这段代码:

var dir = new DirectoryInfo("somedir");
if (dir.Exists) {
   dir.Delete(true);
}
dir.Create();

如果目录不存在,那么该目录会被成功创建。如果目录已经存在,则不会创建新的目录。为什么呢?


2
我没有点踩,但我无法重现这个问题。我使用了 var dir = new DirectoryInfo(@"D:\Test\DirTest");,它可以在 DirTest 存在和不存在的情况下都能正常工作。 - Scott Chamberlain
1
可能是操作系统或框架版本特定的问题。 - Mike Christensen
1
@Denis 或许你应该更习惯于将你的 if() 条件包裹在 { } 中。 - MethodMan
1
我同意@ScottChamberlain的观点,问题无法复现。需要更多信息。用的是什么框架和操作系统,涉及哪个文件夹路径,请提供确切信息。 - Steve
1
我能够重现这个问题,我使用的是Windows 8.1和.NET 4.5。 - Yacoub Massad
显示剩余5条评论
1个回答

11

试试这个:

var dir = new DirectoryInfo("somedir");
if (dir.Exists)
{
   dir.Delete(true);
   dir.Refresh();
}

dir.Create();
您需要在删除后使用refresh来更新状态信息。

2
查看参考源代码,我找不到任何理由调用 Refresh() 会解决这个问题。dir.Create() 调用静态方法 Directory.InternalCreateDirectory(FullPath, OriginalPath, null, true);,没有传递任何状态信息(特别是字段 _dataInitialised)。 - Scott Chamberlain
@ScottChamberlain 这个答案似乎详细解释了为什么它能够工作。 - NikolaiDante
@ScottChamberlain,我做了同样的研究,并没有发现为什么应该使用“Refresh”功能,我没有看到任何对“_dataInitialised”的观察者,也没有看到任何处理目录状态改变的方法执行,我现在正在阅读Win32 API关于“last handle”的内容,当他们写道“RemoveDirectory函数在关闭时标记要删除的目录。因此,在关闭目录的最后一个句柄之前,该目录不会被删除。”链接:https://msdn.microsoft.com/en-us/library/windows/desktop/aa365488(v=vs.85).aspx - Orel Eraki
@OrelEraki 请查看 MSDN 博客中的“已删除但未被遗忘”文章,它可能有助于解释该术语。昨天我偶然发现了这个链接,当时我正在回答关于 FILE_FLAG_DELETE_ON_CLOSE 的问题。 - Scott Chamberlain
@ScottChamberlain,谢谢你啊兄弟.. :) - Orel Eraki
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接