Directory.CreateDirectory导致System.IO错误文件写得太快

时间:2018-05-11 17:08:09

标签: c#

我遇到的问题是我无法在实验室/开发环境中重现。

测试用户在文件复制期间报告以下错误。

  

System.IO.DirectoryNotFoundException:找不到路径的一部分' C:\ ProgramData ....

有问题的代码行是:

Directory.CreateDirectory(path);

现在我猜测这里发生了什么事。 Directory.CreateDirectory将操作交给操作系统。在我的测试和开发机器上有大量资源,操作系统立即创建目录。

在beta用户计算机上,它更受资源挑战,并且它不会创建目录几毫秒......甚至可能是一整秒。

与此同时,我的应用程序已经移动,并期望文件夹存在。     file.CopyTo(path,true);

我的第一个问题是我是否正确连接点。

第二个问题是,如果是这样我应该怎样处理?

  1. 暂停应用程序并监视文件夹创建标志的OS事件,然后继续。这似乎是一个复杂的解决方案。

  2. 暂停应用。启动一个探测文件夹的新线程。当它存在时杀死线程然后继续。也许不是一个新线程但在主线程上有相同的想法?

  3. 还有其他想法吗?

    TIA

2 个答案:

答案 0 :(得分:3)

使用FileSystemWatcher.Created事件在创建目录时回拨。您需要查看父目录的活动。

msdn示例代码: https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.created(v=vs.110).aspx

答案 1 :(得分:2)

您的评估可能是正确的。 Directory.CreateDirectory()调用返回与在文件系统上实际创建目录之间可能存在延迟。这篇文章在这里讨论:

Directory.CreateDirectory Latency Issue?

解决方法是在调用Directory.Exists()之后的循环中调用CreateDirectory()MSDN),如下所示:

Direcotry.CreateDirectory(path);
int waitCount = 10;
do {
   if (Directory.Exists(path))
   {
      break;
   }

   Thread.Sleep(100); // sleep 100ms
   waitCount--;
   if (waitCount <= 0)
   {
      throw new Exception("Failed to create directory");
   }
} while(true);

剪辑很粗糙,但希望你明白了。