C#CreateDirectory行为异常 - 不创建目录

时间:2016-10-12 19:51:29

标签: c# file-io

我正在删除目录(如果存在),并重新创建该目录。

我的代码是这样的:

                if (Directory.Exists(destFolder))
                {
                    Directory.Delete(destFolder, true);
                    DirectoryInfo dirInfo = Directory.CreateDirectory(destFolder);
                }
                else
                {
                    Directory.CreateDirectory(destFolder);
                }

我面临的问题是:如果目录已经包含文件并且该目录当前在其中一个Windows资源管理器窗口中打开(即使在任何应用程序中没有打开文件),那么:

  1. Directory.Delete删除目录,Explorer窗口自动导航到父文件夹。
  2. CreateDirectory不会抛出任何错误,但它返回的DirectoryInfo包含Exists为false。
  3. 由于这个原因,后来在我的程序中,当我尝试在该目录中创建文件时,我收到错误:“找不到路径的一部分”

    为什么这种行为和解决方案是什么?

    感谢。

    编辑1: 有时DirectoryInfo.Exists返回true,但该目录在Explorer中实际上不存在!

2 个答案:

答案 0 :(得分:1)

文件系统操作不同步。

RemoveDirectory函数在关闭时标记要删除的目录。因此,在关闭目录的最后一个句柄之前,不会删除该目录。 如您所见,它将不会真正删除目录,直到它的所有句柄都关闭,但Directory.DeleteDirectory将完成。在您的情况下,这也很可能是这样的并发问题 - 在执行Directory.Exists时并未真正创建目录。所以你也可以在你的情况下使用RemoveDirectory函数。

或者您可以使用代码定期检查,否则请使用Thread.Sleep()

            if (Directory.Exists(destFolder))
            {
                Directory.Delete(destFolder, true);     
                Thread.Sleep(1000);
                DirectoryInfo dirInfo = Directory.CreateDirectory(destFolder);
            }
            else
            {
                Directory.CreateDirectory(destFolder);
            }

还有一个解决方案:

if (Directory.Exists(destFolder))
        {
            DirectoryInfo di = new DirectoryInfo(destFolder);

            foreach (FileInfo file in di.GetFiles())
                file.Delete();

            foreach (DirectoryInfo dir in di.GetDirectories())
                dir.Delete(true);

            DirectoryInfo dirInfo = Directory.CreateDirectory(destFolder);

        }

答案 1 :(得分:1)

因为您要求的解决方案类似于不使用Thread.Sleep的vivek nuna:

您还可以使用FileSystemWatcher来监视目录的删除。在正常情况下,这应该比Thread.Sleep更快。

但是,如果您采用此路线也设置了一个计时器并检查目录是否在没有被告知的情况下消失。当托管驱动器的系统不支持通知时,FileSystemWatcher会以静默方式失败。