Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET目录.Move()与文件.Move()的比较_.net_System.io.file_System.io.directory - Fatal编程技术网

.NET目录.Move()与文件.Move()的比较

.NET目录.Move()与文件.Move()的比较,.net,system.io.file,system.io.directory,.net,System.io.file,System.io.directory,我们有一个应用程序,它将文件存储在临时位置,直到用户决定完成其事务。每个事务的临时目录都是唯一的。一旦完成,文件将从临时位置移动到最终位置,这对于每个事务也是唯一的。这一切都没有任何问题 我相当惊讶,但在搜索谷歌等网站时,我们找不到任何通常被认为是最佳实践的主题: 调用System.IO.Directory.Move(src,des)一次移动整个目录,或者 调用System.IO.File.Move(src,des)一次移动一个文件 由于这些决定通常取决于许多因素,我应该注意以下条件: 源目录和

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

我相当惊讶,但在搜索谷歌等网站时,我们找不到任何通常被认为是最佳实践的主题:

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

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

  • 我不确定是否有固定的“最佳实践”,除了你应该使用最适合这份工作的工具

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


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

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

    • -->-->
    • -->-->

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

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

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

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

    请注意,
    MoveFile
    的文档规定:

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


    这可能是您的问题,也可能不是使用逐文件移动的原因。
    Directory.Move
    文档明确提到了这一点(并且
    Directory.Move
    的参考源显式检查源和目标是否具有相同的根)。

    源和目标是否在同一卷/分区上?是。通用的目录结构是\temp\,和\final\。我想说的是,只需设置一个小的测试环境,并使用
    directory.Move()
    File.Move()
    比较,记录速度。做几次,然后选择更快的。@sab669如果他想移动整个目录,我会使用
    目录。Move
    。只有当出现性能问题时,我才会开始测试哪个更好。很可能会有很大的不同。首先使用最明显的方法。这是一个公平的观点,假设从纯可读性的角度来看,只使用目录更有意义