我有一个问题,我无法在实验室/开发环境中重现。
测试版用户在文件复制期间报告以下错误。
System.IO.DirectoryNotFoundException: 找不到路径 'C:\ProgramData.......( 的一部分。
有问题的代码行是:
Directory.CreateDirectory(path);
现在我推测这里发生了什么。Directory.CreateDirectory 将操作交给操作系统。在我的测试和开发机器上,有大量资源,操作系统会立即创建目录。
在测试版用户机器上,它对资源的挑战更大,并且在几毫秒内不会创建目录......甚至可能整整一秒钟。
与此同时,我的应用程序已经移动,并期望该文件夹在那里。 文件。CopyTo(path, true(;
我的第一个问题是我是否正确连接了这些点。
第二个问题是,如果是这样,我应该如何处理?
使应用休眠并监视"已创建文件夹"标志的操作系统事件,然后继续。这似乎是一个复杂的解决方案。
使应用休眠。 启动一个探测文件夹的新线程。当它存在时,终止线程然后继续。也许不是新线程,而是主线程上的相同想法?
您的评估可能是正确的。在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