3

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

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

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

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

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

2 回答 2

4

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

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


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

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

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

于 2015-10-13T15:36:22.200 回答
1

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

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

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

请注意,文档MoveFile指定:

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

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

于 2015-10-14T11:27:27.320 回答