.NET Directory.Move() 与 File.Move()
.NET Directory.Move() vs File.Move()
我们有一个应用程序将文件存储在一个临时位置,直到用户决定完成他们的交易。临时目录对于每个事务都是唯一的。一旦完成,文件将从临时位置移动到最终位置,这对于每个事务也是唯一的。这一切都没有任何问题。
我很惊讶,但是在搜索 Google 和 SO 时,我们找不到任何通常被认为是最佳实践的主题:
- 调用 System.IO.Directory.Move(src, des) 一次移动整个目录,或者
- 调用 System.IO.File.Move(src, des) 一次移动一个文件。
由于这些决定通常取决于多种因素,因此我应该注意以下条件:
- 源目录和目标目录将始终在同一台机器上,但进行调用的应用程序将在同一网络上的不同机器上。我相信应用程序服务器和文件服务器是同一台物理机器上的独立虚拟机,但我并不肯定。
- 文件的数量可以从 1 到 10,或者更多。我自己不监控生产系统,所以我不确定平均文件数量,或者数量分布如何。
我不确定是否有任何固定的 "best practice" 除了你应该使用最合适的工具来完成工作。
由于您正在做的是将整个目录从临时location/status移动到永久location/status我建议使用Directory.Move
.这意味着您的代码将更明显地反映您的逻辑意图。
如果您更关心这两种方法之间的技术差异...
在 Microsoft 版本的 .NET 中,Directory.Move
和 File.Move
最终都会调用 Win32 MoveFile
or MoveFileEx
函数。您可以通过查看参考来源来确认这一点:
Directory.Move
--> Directory.InternalMove
--> Win32Native.MoveFile
File.Move
--> File.InternalMove
--> Win32Native.MoveFile
考虑到这一点,调用 MoveFile
一次(通过 Directory.Move
)似乎比每次交易多次调用它(通过 File.Move
)更可取).
我认为最大的问题不是速度而是:移动错误会发生什么?
我将使用 LukeH 的回答中的信息而不是在这里重复它。
MoveFile
目录移动的行为应该适用于无法移动单个文件的情况。如果您使用每个文件移动,那么您必须以适当的方式自行处理错误情况。这需要仔细考虑。
请注意 MoveFile
的文档指定:
The one caveat is that the MoveFile function will fail on directory moves when the destination is on a different volume.
这对您来说可能是问题,也可能不是问题,也是使用按文件移动的理由。 Directory.Move
文档明确提到了这一点(Directory.Move
的参考源明确检查了具有相同根的源和目标)。
我们有一个应用程序将文件存储在一个临时位置,直到用户决定完成他们的交易。临时目录对于每个事务都是唯一的。一旦完成,文件将从临时位置移动到最终位置,这对于每个事务也是唯一的。这一切都没有任何问题。
我很惊讶,但是在搜索 Google 和 SO 时,我们找不到任何通常被认为是最佳实践的主题:
- 调用 System.IO.Directory.Move(src, des) 一次移动整个目录,或者
- 调用 System.IO.File.Move(src, des) 一次移动一个文件。
由于这些决定通常取决于多种因素,因此我应该注意以下条件:
- 源目录和目标目录将始终在同一台机器上,但进行调用的应用程序将在同一网络上的不同机器上。我相信应用程序服务器和文件服务器是同一台物理机器上的独立虚拟机,但我并不肯定。
- 文件的数量可以从 1 到 10,或者更多。我自己不监控生产系统,所以我不确定平均文件数量,或者数量分布如何。
我不确定是否有任何固定的 "best practice" 除了你应该使用最合适的工具来完成工作。
由于您正在做的是将整个目录从临时location/status移动到永久location/status我建议使用Directory.Move
.这意味着您的代码将更明显地反映您的逻辑意图。
如果您更关心这两种方法之间的技术差异...
在 Microsoft 版本的 .NET 中,Directory.Move
和 File.Move
最终都会调用 Win32 MoveFile
or MoveFileEx
函数。您可以通过查看参考来源来确认这一点:
Directory.Move
-->Directory.InternalMove
-->Win32Native.MoveFile
File.Move
-->File.InternalMove
-->Win32Native.MoveFile
考虑到这一点,调用 MoveFile
一次(通过 Directory.Move
)似乎比每次交易多次调用它(通过 File.Move
)更可取).
我认为最大的问题不是速度而是:移动错误会发生什么?
我将使用 LukeH 的回答中的信息而不是在这里重复它。
MoveFile
目录移动的行为应该适用于无法移动单个文件的情况。如果您使用每个文件移动,那么您必须以适当的方式自行处理错误情况。这需要仔细考虑。
请注意 MoveFile
的文档指定:
The one caveat is that the MoveFile function will fail on directory moves when the destination is on a different volume.
这对您来说可能是问题,也可能不是问题,也是使用按文件移动的理由。 Directory.Move
文档明确提到了这一点(Directory.Move
的参考源明确检查了具有相同根的源和目标)。