10

I'm trying to create a remote directory, and then write a file to it. Every great once in a while, the application fails with a System.IO.DirectoryNotFoundException while trying to write the file.

When I write the file, I'm using the returned DirectoryInfo object to help create the file path, so the application seems to think that the directory has been created. However, the directory does not exist.

Is there any chance that I'm trying to write to the directory before Windows has finished creating it? I would think that the Directory.CreateDirectory would not return until this task was finished.

4

3 回答 3

8

答案——是的。预期文件/目录创建滞后时的行为。其他评论者提出的普通解决方案是使用超时重试。无论使用什么文件函数,行为都是相同的:Findfirst、CreateFile、WaitForSingleObject 等。

另一个解决方案是使用在 Vista 和更高版本的 Windows 操作系统上发现的 API 的新事务功能。

这个问题很严重,并且在其他平台上制作并转移到 Windows 的文件密集型项目的开发人员从未理解过:如 DOS/CMD 脚本、SVN 客户端、Cygwin、perl、各种 Java 应用程序、各种安装程序等。

于 2010-02-08T23:39:16.493 回答
6

我刚遇到这个问题,对我来说情况是这样的:

if(!exportDirectory.Exists)
    exportDirectory.Create();

然后稍后在另一个具有相同DirectoryInfo 对象的类中传递给它时,我执行以下操作:

if (!exportDirectory.Exists)
    throw new DirectoryNotFoundException(exportDirectory.FullName);

而且该目录显然仍然不存在(尽管我在 Windows 中打开了父目录,当然我可以在我面前看到它)。

我找到的解决方案是在最初创建我应该调用的目录之后:

exportDirectory.Refresh();

来自微软:

刷新对象的状态。(继承自 FileSystemInfo。)

于 2015-02-06T20:53:13.930 回答
4

虽然我从未经历过这种行为并且无法解释它,但一个实用的解决方案是围绕您访问目录的调用设置一个循环。在该循环中捕获 DirectoryNotFoundException,并在每次短暂暂停后重试几次访问。如果超过重试次数,则重新抛出异常。

此时添加详细的日志记录可以帮助您确定问题的实际原因。

于 2010-02-08T23:21:30.093 回答