为什么有一个Move方法,而不是System.IO的Directory类中的Copy方法?

时间:2013-08-30 12:59:41

标签: c# .net

正如标题所示,System.IO的Directory.Move类中有Directory但没有Directory.Copy方法。这有什么理由吗?

更新

对我来说,复制和移动操作几乎完全相同,唯一的区别是移动操作执行复制然后删除目标。并且错误处理对于移动和复制一样复杂。所以,如果实施了一个,为什么不是另一个?

更新2:

这是来自mmclean的评论引用:

  

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

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

3 个答案:

答案 0 :(得分:5)

实用的答案是没有Windows API调用来复制目录,而 Windows API调用来移动(也就是重命名)目录(MoveFile())。 / p>

Directory.Move()调用MoveFile()作为其实施的一部分。但它没有任何东西可以要求复制。

他们似乎保持界面与Windows API提供的界面大致相似。

此外,失败的目录副本的错误处理非常糟糕。是否必须回滚任何更改?如何处理失败的副本将依赖于上下文,因此很难采用通用方法。这可能就是为什么没有Windows API调用来复制目录。

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

(尽管如此处的另一个答案中所述,有一种复制目录的Visual Basic方法,它必须解决其中一些问题。)

答案 1 :(得分:3)

答案 2 :(得分:2)

您希望Directory.Copy()方法做什么?

这不是很明显,至少有3个明确的选择:

  • 创建一个名称相同的新空目录
  • 复制所有子目录
  • 复制所有子目录和所有文件

虽然所有3个可能在某些时候都有用,但程序员不会立即从名称中知道会发生什么。提供这种功能只会造成混乱。

第一个几乎没用,它是一个带有另一个名字的Create()。最后2个相对昂贵,需要一些选项来定制行为。

您可以自己编写,但请避免使用名称Copy()。考虑Directory.CloneEmptyFolders()Directory.CloneFoldersWithFiles()