复制带有所有文件和文件夹的目录

3

我想将一个目录复制到另一个路径。
我找到了这种方法,但它并不会复制目录,只会复制其中的子目录和文件:

string sourcedirectory = Environment.ExpandEnvironmentVariables("%AppData%\\Program");

foreach (string dirPath in Directory.GetDirectories(sourcedirectory, "*", SearchOption.AllDirectories))
{
    Directory.CreateDirectory(dirPath.Replace(sourcedirectory, folderDialog.SelectedPath));
}
foreach (string newPath in Directory.GetFiles(sourcedirectory, "*.*", SearchOption.AllDirectories))
{
    File.Copy(newPath, newPath.Replace(sourcedirectory, folderDialog.SelectedPath), true);
}

我该如何在输出中获取“Program”文件夹及其所有文件和子文件夹?
结果:

我怎样才能在输出中获得“Program”文件夹及其包含的所有文件和子文件夹?


你说的“它不复制目录”是什么意思?显然它会复制目录本身——如果顶层目录不存在于输出中,它就无法复制子目录和文件。你是指它不会复制顶层目录中的文件吗?看起来它肯定会,只要浏览一下代码就知道了。(个人而言,我更喜欢递归解决方案,而不是依赖于string.Replace()或其他路径操作,但这里的代码看起来足够合理)。 - Peter Duniho
我相信这是一个重复的问题。 看一下这个问题的MSDN解决方案(我认为这是最后一个)- 它应该复制所有内容,包括目录本身。复制目录 c# - Ziv Weissman
@PeterDuniho 这很奇怪。我没有得到“Program”文件夹作为输出,只有它里面的文件夹和文件。你测试过了吗? - DotNet
@DotNet:抱歉,我应该重新表述第二个建议:需要更改的不是newPath,而是folderDialog.SelectedPath - Peter Duniho
@PeterDuniho 合并路径成功,现在我得到了“Program”文件夹作为输出,里面包含了所有正确的文件和文件夹。请回答并标记为已接受。谢谢! - DotNet
显示剩余4条评论
2个回答

1
如果在开始复制之前调整输出路径,它应该可以工作:
string sourcedirectory = Environment.ExpandEnvironmentVariables("%AppData%\\Program");

folderDialog.SelectedPath = Path.Combine(folderDialog.SelectedPath,
    Path.GetFileName(sourcedirectory));

foreach (string dirPath in Directory.GetDirectories(sourcedirectory, "*", SearchOption.AllDirectories))
{
    Directory.CreateDirectory(dirPath.Replace(sourcedirectory, folderDialog.SelectedPath));
}
foreach (string newPath in Directory.GetFiles(sourcedirectory, "*.*", SearchOption.AllDirectories))
{
    File.Copy(newPath, newPath.Replace(sourcedirectory, folderDialog.SelectedPath), true);
}

1
你可以使用递归函数来完成它:
private void button1_Click(object sender, EventArgs e)
    {
        this.CopyAll(new DirectoryInfo(@"D:\Original"), new DirectoryInfo(@"D:\Copy"));
    }
    private void CopyAll(DirectoryInfo oOriginal, DirectoryInfo oFinal)
    {
        foreach (DirectoryInfo oFolder in oOriginal.GetDirectories())
            this.CopyAll(oFolder, oFinal.CreateSubdirectory(oFolder.Name));

        foreach (FileInfo oFile in oOriginal.GetFiles())
            oFile.CopyTo(oFinal.FullName + @"\" + oFile.Name, true);
    }

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