【问题标题】:Directory.CreateDirectory Latency Issue?Directory.CreateDirectory 延迟问题?
【发布时间】:2011-01-14 14:22:53
【问题描述】:

我正在尝试创建一个远程目录,然后向其中写入一个文件。每隔一段时间,应用程序就会在尝试写入文件时失败并出现 System.IO.DirectoryNotFoundException。

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

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

【问题讨论】:

  • 我没有一个好的答案,但你没有说什么是“远程”。因此,可能是远程服务器已在本地文件系统上创建文件夹但在浏览时尚未返回它的情况。可能是一个缓存问题(真的会缓存文件系统结构吗?)。
  • 远程服务器是 Windows 服务器还是运行 Samba 或类似服务器的不同类型的服务器?
  • 这是 AS400 上的 IFS 共享。应用程序在 Windows 机器上运行,使用 UNC 路径访问 IFS 共享。
  • 显然是一个 IBM 错误。捕获异常并重试几次。

标签: c# .net windows directory system.io.directory


【解决方案1】:

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

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

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

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

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

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

exportDirectory.Refresh();

来自微软:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • +1 我们经常看到这一点,以至于我们有一个完整的 IO 调用库,已针对我们的 NAS 设置进行了调整。
    【解决方案3】:

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

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

    【讨论】:

    • 检查 Directory.Exists() 可能比捕获异常更有效,除非它错误地返回 true 但访问它会抛出异常。
    • @CoryCharlton:这样更有效率吗?检查文件系统比抛出和检查异常要差一个数量级,并且可能在这种情况下文件系统也会执行 Directory.Exists()。
    猜你喜欢
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2018-07-19
    相关资源
    最近更新 更多