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

时间:2015-10-13 14:22:30

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

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

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

  1. 调用System.IO.Directory.Move(src,des)简单地移动整个目录,或者
  2. 调用System.IO.File.Move(src,des)一次移动一个文件。
  3. 由于这些决定通常依赖于许多因素,我应该注意以下条件:

    1. 源目标和目标目录将始终位于同一台计算机上,但进行呼叫的应用程序将位于同一网络上的其他计算机上。我相信应用服务器和文件服务器是同一台物理机上的独立虚拟机,但我并不乐观。
    2. 文件数可以是1到10或更多。我自己不监控生产系统,因此我不确定平均文件数或计数的分布情况。

2 个答案:

答案 0 :(得分:3)

我不确定是否有任何固定的“最佳做法”,除了你应该使用最合适的工具。

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

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

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

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

答案 1 :(得分:0)

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

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

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

请注意MoveFile的文档指定:

  

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

对您而言,这可能是也可能不是问题,并且有理由使用每个文件的Move。 Directory.Move文档明确提到了这一点(并且Directory.Move的引用源显式检查具有相同根的源和目标)。