如何在.NET中复制一个文件夹以及其中的所有子文件夹和文件?

30

可能是重复问题:
在C#中复制整个目录的最佳方法

我想在.NET中将文件夹及其所有子文件夹和文件从一个位置复制到另一个位置。有没有比遍历目录树更简单、更好或更快的方法?

我看到System.IO.File类上的Copy方法,但想知道是否有比遍历目录树更简单、更好或更快的方法。


这篇关于C语言中将一个目录及其内容复制到另一个目录的博客可能会对你有所帮助:http://xneuron.wordpress.com/2007/04/12/copy-directory-and-its-content-to-another-directory-in-c/ ,它展示了一个简单的递归方法。 - Daniel LeCheminant
1
我期待着需要在文件系统上执行操作,因为这是使用递归的正当理由! - mmcdole
3个回答

51

嗯,这里有Steve提到的VisualBasic.dll实现,还有我自己用过的东西。

private static void CopyDirectory(string sourcePath, string destPath)
{
    if (!Directory.Exists(destPath))
    {
        Directory.CreateDirectory(destPath);
    }

    foreach (string file in Directory.GetFiles(sourcePath))
    {
        string dest = Path.Combine(destPath, Path.GetFileName(file));
        File.Copy(file, dest);
    }

    foreach (string folder in Directory.GetDirectories(sourcePath))
    {
        string dest = Path.Combine(destPath, Path.GetFileName(folder));
        CopyDirectory(folder, dest);
    }
}

12

Michal Talaga在他的文章中提到以下内容:

  • Microsoft解释为什么在.NET中不应该有Directory.Copy()操作。
  • 来自Microsoft.VisualBasic.dll程序集中CopyDirectory()的实现。

然而,基于File.Copy()Directory.CreateDirectory()的递归实现已足够满足大多数基本需求。


1
那是一个有趣的链接。我不确定微软的论点是否站得住脚。但这解释了为什么功能缺失了。 - dthrasher

3

如果没有更好的方法...也许可以使用Process.Start来启动robocopy.exe?


Robocopy在使用Process.Start运行时无法正确解析引号,因此您的源/目标路径不能包含空格。如果有空格,您必须使用8dot3文件名。唯一一个Robocopy似乎可以正确接受引号的时间是从命令行或BAT文件中。 - Brain2000
@Brain2000 如果空格是问题,你可以随时使用短路径。 - David Work

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接