如何在C#中复制整个目录的内容?

我想在C#中将目录的全部内容从一个位置复制到另一个位置。

似乎没有办法做到这一点使用System.IO类没有很多递归。

如果我们添加对Microsoft.VisualBasic的引用,我们可以使用VB中的一种方法:

new Computer().FileSystem.CopyDirectory(sourceFolder, outputFolder);

这似乎是一个相当丑陋的黑客。 有没有更好的办法?


更容易

//Now Create all of the directories
foreach (string dirPath in Directory.GetDirectories(SourcePath, "*", 
    SearchOption.AllDirectories))
    Directory.CreateDirectory(dirPath.Replace(SourcePath, DestinationPath));

//Copy all the files & Replaces any files with the same name
foreach (string newPath in Directory.GetFiles(SourcePath, "*.*", 
    SearchOption.AllDirectories))
    File.Copy(newPath, newPath.Replace(SourcePath, DestinationPath), true);

嗯,我想我误解了这个问题,但我会冒这个风险。 以下简单的方法有什么问题?

public static void CopyFilesRecursively(DirectoryInfo source, DirectoryInfo target) {
    foreach (DirectoryInfo dir in source.GetDirectories())
        CopyFilesRecursively(dir, target.CreateSubdirectory(dir.Name));
    foreach (FileInfo file in source.GetFiles())
        file.CopyTo(Path.Combine(target.FullName, file.Name));
}

编辑自从这篇文章为一个同样简单的问题的简单答案赢得了令人印象深刻的downvotes数量之后,让我添加一个解释。 在投票前阅读此内容。

首先, 这个代码并不是作为问题中代码的直接替代品 。 仅用于说明目的。

Microsoft.VisualBasic.Devices.Computer.FileSystem.CopyDirectory执行一些额外的正确性测试(例如源和目标是否是有效的目录,源是目标的父级等),这些答案中缺少这些测试。 该代码可能也更加优化。

也就是说,代码运行良好。 它已经(几乎完全相同)在成熟的软件中使用多年。 除了所有IO处理中固有的浮躁(例如,如果用户在您的代码写入时手动拔下USB驱动器会发生什么情况?),但没有已知问题。

特别是,我想指出,在这里使用递归是绝对不是问题。 理论上(概念上讲,它不是最优雅的解决方案),也不是在实践中:这段代码不会溢出堆栈。 该堆栈足够大以处理甚至是深度嵌套的文件层次结构。 在堆栈空间变成问题之前很久,文件夹路径长度限制就会进入。

请注意,恶意用户可能能够通过使用每个深度嵌套的一个字母目录来打破这一假设。 我没有试过这个。 但仅仅为了说明这一点:为了使这些代码在典型的计算机上溢出,这些目录必须嵌套几千次。 这根本不是现实的情况。


从MSDN复制:

using System;
using System.IO;

class CopyDir
{
    public static void Copy(string sourceDirectory, string targetDirectory)
    {
        DirectoryInfo diSource = new DirectoryInfo(sourceDirectory);
        DirectoryInfo diTarget = new DirectoryInfo(targetDirectory);

        CopyAll(diSource, diTarget);
    }

    public static void CopyAll(DirectoryInfo source, DirectoryInfo target)
    {
        Directory.CreateDirectory(target.FullName);

        // Copy each file into the new directory.
        foreach (FileInfo fi in source.GetFiles())
        {
            Console.WriteLine(@"Copying {0}{1}", target.FullName, fi.Name);
            fi.CopyTo(Path.Combine(target.FullName, fi.Name), true);
        }

        // Copy each subdirectory using recursion.
        foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
        {
            DirectoryInfo nextTargetSubDir =
                target.CreateSubdirectory(diSourceSubDir.Name);
            CopyAll(diSourceSubDir, nextTargetSubDir);
        }
    }

    public static void Main()
    {
        string sourceDirectory = @"c:sourceDirectory";
        string targetDirectory = @"c:targetDirectory";

        Copy(sourceDirectory, targetDirectory);
    }

    // Output will vary based on the contents of the source directory.
}
链接地址: http://www.djcxy.com/p/6119.html

上一篇: How to copy the entire contents of directory in C#?

下一篇: c# network login