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



我有一个问题,我无法在实验室/开发环境中重现。

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

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

有问题的代码行是:

Directory.CreateDirectory(path);

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

在测试版用户机器上,它对资源的挑战更大,并且在几毫秒内不会创建目录......甚至可能整整一秒钟。

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

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

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

  1. 使应用休眠并监视"已创建文件夹"标志的操作系统事件,然后继续。这似乎是一个复杂的解决方案。

  2. 使
  3. 应用休眠。 启动一个探测文件夹的新线程。当它存在时,终止线程然后继续。也许不是新线程,而是主线程上的相同想法?

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

Directory.CreateDirectory 延迟问题?

解决方法是在调用CreateDirectory()之后立即在循环中调用Directory.Exists()(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);

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

使用 FileSystemWatcher.Created Event 在创建目录时回调您。您需要监视父目录的活动。

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