.NET Directory.Move() vs File.Move()



我们有一个应用程序,它将文件存储在一个临时位置,直到用户决定完成他们的事务。临时目录对于每个事务都是唯一的。完成后,文件将从临时位置移动到最终位置,该位置对于每个事务也是唯一的。

一切正常

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

  1. System.IO.Directory打电话。Move(src, des)一次移动整个目录,或者
  2. System.IO.File打电话。Move(src, des)一次移动一个文件。

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

  1. 源目录和目标目录将始终在同一台机器上,但是进行调用的应用程序将在同一网络上的不同机器上。我相信应用服务器和文件服务器是同一物理机器上的独立VM,但我不肯定。
  2. 文件的数量可以从1到10,或者更多。我自己不监视生产系统,所以我不确定平均文件计数,也不确定计数的分布情况。

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

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


如果你更关心两种方法之间的技术差异…

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

  • Directory.Move -> Directory.InternalMove -> Win32Native.MoveFile
  • File.Move -> File.InternalMove -> Win32Native.MoveFile

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

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

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

如果目录移动失败,MoveFile的行为应该适合于移动单个文件。如果使用每个文件移动,则必须以适当的方式自己处理错误条件。这需要仔细考虑。

注意MoveFile的文档指定:

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

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

最新更新