2010-02-08 143 views
8

我试图创建一个远程目录,然后向它写入一个文件。每过一段时间,应用程序都会在尝试写入文件时失败,并显示System.IO.DirectoryNotFoundException。Directory.CreateDirectory延迟问题?

当我编写文件时,我使用返回的DirectoryInfo对象来帮助创建文件路径,因此应用程序似乎认为该目录已创建。但是,该目录不存在。

在Windows完成创建之前,是否有机会尝试写入目录?我认为Directory.CreateDirectory在这个任务完成之前不会返回。

+0

我没有一个很好的答案,但是你没有明确地说“remote”是什么。因此,也许这是远程服务器在本地文件系统上创建了文件夹但浏览时尚未返回的情况。也许是一个缓存问题(是否有什么实际缓存文件系统结构?)。 – 2010-02-08 23:15:06

+0

远程服务器是Windows服务器还是运行Samba或类似服务器的不同类型的服务器? – Jacob 2010-02-08 23:23:14

+0

这是AS400上的IFS份额。该应用程序在Windows机器上运行,使用UNC路径访问IFS共享。 – majorpayne27 2010-02-08 23:37:48

回答

7

答案 - 是的。预计文件/目录创建滞后时的行为。正如其他评论者所提出的普通解决方案是在一些超时时间内使用重试。无论使用什么文件功能,其行为都是一样的:Findfirst,CreateFile,WaitForSingleObject等。

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

这个问题令人讨厌,而且从未被其他平台上的文件密集型项目开发人员所理解,并转移到了Windows上:像DOS/CMD脚本,SVN客户端,Cygwin,perl,各种java应用程序,各种安装程序等。

+1

+1我们总是看到这一点,直到我们有一个完整的IO调用库调整到我们的NAS设置。 – 2010-02-08 23:44:03

+0

有谁知道那些其他神奇的方法是什么? – Mrchief 2016-03-02 22:38:49

4

虽然我从来没有经历过这种行为,也无法解释它,但实用的解决方案是围绕访问目录的呼叫建立一个循环。在该循环内捕获DirectoryNotFoundException,并在每次短暂暂停后重试访问几次。如果超过重试次数,则重新处理异常。

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

+0

检查'Directory.Exists()'可能会更有效,而不是捕获异常,除非该函数错误地返回true,并且访问它会抛出异常。 – 2010-02-08 23:39:09

+0

@CoryCharlton:这是如何更有效率?检查文件系统比抛出和检查异常差一个数量级,并且可以假定文件系统在这种情况下也会执行Directory.Exists()。 – Arafangion 2012-01-06 09:53:56

6

我只是有这个问题,我的情况是这样的:

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

再后来当有传递给它这个相同 DirectoryInfo对象另一个类我做:

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

而目录显然仍然不存在(虽然我有父窗口在Windows中打开,当然我可以看到它在我面前)。

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

exportDirectory.Refresh(); 

从微软:

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