我正在尝试创建一个远程目录,然后将文件写入其中。每隔一段时间,在尝试编写文件时,应用程序会因System.IO.DirectoryNotFoundException而失败。
当我编写文件时,我正在使用返回的DirectoryInfo对象来帮助创建文件路径,因此应用程序似乎认为该目录已经创建。但是,该目录不存在。
在Windows完成创建之前,我是否有可能尝试写入目录?我认为Directory.CreateDirectory在此任务完成之前不会返回。
答案 0 :(得分:8)
答案 - 是的。当文件/目录创建滞后时的行为是预期的。其他评论者提出的普通解决方案是使用具有一些超时的重试。无论使用什么文件函数,行为都是相同的:Findfirst,CreateFile,WaitForSingleObject等。
另一个解决方案是使用Vista和更高版本Windows操作系统上的API新事务功能。
问题是令人讨厌的,开发人员从未理解在其他平台上制作的文件密集型项目并转移到Windows:如DOS / CMD脚本,SVN客户端,Cygwin,perl,各种Java应用程序,各种安装程序等。
答案 1 :(得分:6)
我刚遇到这个问题,对我来说情况是这样的:
if(!exportDirectory.Exists)
exportDirectory.Create();
然后在另一个将相同 DirectoryInfo对象传递给它的类中,我做了一个:
if (!exportDirectory.Exists)
throw new DirectoryNotFoundException(exportDirectory.FullName);
目录显然仍然不存在(虽然我在Windows中打开了父目录,当然我可以在我面前看到它)。
我找到的解决方案是在初始创建我应该调用的目录之后:
exportDirectory.Refresh();
来自Microsoft:
刷新对象的状态。 (继承自FileSystemInfo。)
答案 2 :(得分:4)
虽然我从未经历过这种行为并且无法解释,但实用的解决方案是围绕访问目录的呼叫设置循环。在该循环中捕获DirectoryNotFoundException,并在每次短暂暂停后重试访问几次。如果超出重试计数,则重新抛出异常。
此时添加详细日志记录可帮助您确定问题的实际原因。