【问题标题】:Why is there a Move method, but not a Copy method in Directory class from System.IO?为什么 System.IO 的 Directory 类中有 Move 方法,但没有 Copy 方法?
【发布时间】:2013-09-03 05:17:21
【问题描述】:

正如标题所说,System.IO 的Directory 类中有一个Directory.Move 但没有Directory.Copy 方法。有什么原因吗?

更新:

对我来说,复制和移动操作几乎相同,唯一的区别是移动操作先复制然后删除目标。错误处理对于移动和复制一样复杂。那么,如果一个实施了,为什么另一个没有呢?

更新 2:

这是来自 mmclean 评论的引述:

Directory.Move 但不会移动,而是重命名。就这样 “destination”路径是指向目录的完整路径,而不是 而不是“移动到”的位置,移动到不同的驱动器是 不可能。

所以我知道 move 实际上做了一个 rename 操作(仅更改和输入文件分配表)。但是移动和复制命令在合并目标中存在的项目时都有相同的问题(覆盖/保留两者)。因此,复制操作唯一增加的复杂性是它必须物理复制文件。但这仍然不能解释不实施它的决定。更重要的是,当复制命令在 VB.NET 中实现时,MSDN here 上有一个非常简单的复制操作实现。

【问题讨论】:

  • 这个 Eric Lippert 的回答也应该回答你的问题:stackoverflow.com/a/2806990/1163867
  • @MarcinJuraszek - EL 正在谈论 C# 功能,这个问题是关于 BCL。两种截然不同的东西。但是会应用类似的逻辑。
  • 在 .NET 4.5 中有一项革命性的工作围绕 here
  • Move 不会进行复制和删除。它做了一个动作。完全不一样。 (除非你在不同的卷上移动,然后你会得到一个例外!)移动一个目录只需要更新文件分配表中的目录条目
  • 你想知道为什么吗?或者你真的想复制一份吗?

标签: c# .net


【解决方案1】:

务实的答案是没有 Windows API 调用来复制目录,而 有一个 Windows API 调用来移动(也称为重命名)目录 (MoveFile())。

Directory.Move() 调用 MoveFile() 作为其实现的一部分。但是没有什么可以要求复制的。

他们似乎使界面与 Windows API 提供的界面大体相似。

此外,对失败的目录副本的错误处理非常讨厌。它是否必须回滚任何更改?如何处理失败的副本将非常依赖于上下文,以至于很难有一个通用的方法。这可能也是没有 Windows API 调用来复制目录的原因。

另一件可能导致复杂性增加的事情是在复制过程中锁定了不同的文件,以及在复制过程中从目录中添加和删除文件。

(虽然这里的另一个答案中提到,有一个复制目录的 Visual Basic 方法,它必须解决其中的一些问题。)

【讨论】:

  • 如果您需要回滚任何更改,这不仅仅是几行。想想您将如何从部分成功的失败副本中恢复(并且可能由于磁盘已满而失败)。我想你可以让它删除新目录。
【解决方案2】:

与其问为什么,不如直接使用VB.NET的CopyDirectoryhttp://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.filesystem.copydirectory.aspx

【讨论】:

  • 我知道我可以改用什么。我只是好奇其中的原因。
  • 我知道,我知道,但我只是渴望使用“而不是质疑为什么......”
猜你喜欢
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
相关资源
最近更新 更多