【问题标题】:.NET Directory.Move() vs File.Move().NET Directory.Move() 与 File.Move()
【发布时间】:2016-01-11 08:27:16
【问题描述】:

我们有一个应用程序将文件存储在一个临时位置,直到用户决定完成他们的交易。每个事务的临时目录都是唯一的。一旦完成,文件就会从临时位置移动到最终位置,这对于每个事务也是唯一的。这一切都没有任何问题。

我很惊讶,但是在搜索 Google 和 SO 时,我们找不到任何通常被认为是最佳做法的主题:

  1. 调用 System.IO.Directory.Move(src, des) 以简单地一次移动整个目录,或者
  2. 调用 System.IO.File.Move(src, des) 一次移动一个文件。

由于这些决定通常取决于许多因素,我应该注意以下条件:

  1. 源目录和目标目录将始终位于同一台计算机上,但发出调用的应用程序将位于同一网络上的另一台计算机上。我相信应用服务器和文件服务器是同一台物理机上的不同虚拟机,但我并不肯定。
  2. 文件数的范围可以从 1 到 10 或更多。我自己不监控生产系统,因此我不确定平均文件数,也不知道该数的分布范围。

【问题讨论】:

  • 源和目标是否在同一个卷/分区上?
  • 是的。通用目录结构为\temp\\final\
  • 我会说只是设置一个小的测试环境并使用Directory.Move() 记录速度与File.Move() 进行比较。做很多次,然后选择哪个更快。
  • @sab669 如果他想移动整个目录,我会使用Directory.Move。只有当存在 性能问题时,我才会开始测试哪个更好。有很大差异的可能性很小。首先使用最明显的方式。
  • 这是一个公平的观点,假设从纯粹的可读性角度来看,仅使用 Directory 更有意义

标签: .net system.io.file system.io.directory


【解决方案1】:

我不确定是否有任何固定的“最佳实践”,除了您应该使用最适合工作的工具。

由于您正在做的是将整个目录从其临时位置/状态移动到永久位置/状态,我建议使用Directory.Move。这意味着您的代码将更明显地反映您的逻辑意图。


如果您更关心这两种方法之间的技术差异......

在 Microsoft 版本的 .NET 中,Directory.MoveFile.Move 最终都会调用 Win32 的 MoveFileMoveFileEx 函数。您可以通过查看参考来源来确认这一点:

考虑到这一点,似乎对MoveFile 调用一次(通过Directory.Move)通常比为每个事务调用多次(通过File.Move)更可取。

【讨论】:

    【解决方案2】:

    我认为最大的问题不是速度,而是:移动错误会发生什么?

    我将使用 LukeH 的答案中的信息,而不是在这里重复。

    MoveFile 的目录移动行为应该适用于无法移动单个文件的情况。如果您使用每个文件移动,那么您必须自己以适当的方式处理错误情况。这需要仔细考虑。

    请注意,MoveFile 的文档指定:

    需要注意的是,当目标位于不同的卷上时,MoveFile 函数将在目录移动时失败。

    这对您来说可能是也可能不是问题,也是使用每个文件移动的理由。 Directory.Move 文档明确提到了这一点(Directory.Move 的参考源明确检查源和目标是否具有相同的根)。

    【讨论】:

      猜你喜欢
      • 2011-02-13
      • 1970-01-01
      • 2020-06-17
      • 2011-11-30
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      相关资源
      最近更新 更多