我们有一个应用程序,它将文件存储在一个临时位置,直到用户决定完成他们的事务。临时目录对于每个事务都是唯一的。完成后,文件将从临时位置移动到最终位置,该位置对于每个事务也是唯一的。
一切正常我很惊讶,但是当搜索Google和SO时,我们找不到任何通常被认为是最佳实践的主题:
- System.IO.Directory打电话。Move(src, des)一次移动整个目录,或者
- System.IO.File打电话。Move(src, des)一次移动一个文件。
由于这些决定通常依赖于许多因素,因此我应该注意以下条件:
- 源目录和目标目录将始终在同一台机器上,但是进行调用的应用程序将在同一网络上的不同机器上。我相信应用服务器和文件服务器是同一物理机器上的独立VM,但我不肯定。
- 文件的数量可以从1到10,或者更多。我自己不监视生产系统,所以我不确定平均文件计数,也不确定计数的分布情况。
我不确定是否有任何固定的"最佳实践",除了你应该使用最合适的工具。
由于您正在做的是将整个目录从其临时位置/状态移动到永久位置/状态,我建议使用Directory.Move
。这意味着你的代码将更明显地反映你的逻辑意图。
如果你更关心两种方法之间的技术差异…
在微软版本的。net中,Directory.Move
和File.Move
最终调用Win32的MoveFile
或MoveFileEx
函数。您可以通过查看参考源代码来确认这一点:
-
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
的参考源代码明确地检查源和目标具有相同的根)。