【问题标题】:Copy directory with all files and folders复制包含所有文件和文件夹的目录
【发布时间】:2015-01-03 17:23:00
【问题描述】:

我正在尝试将一个目录复制到另一个路径。
我找到了这个方法,但是它不复制目录,只复制里面的子目录和文件:

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);
}

如何在输出中获取包含所有文件和子文件夹的“程序”文件夹?

【问题讨论】:

  • “它不复制目录”是什么意思?它显然会复制目录本身——如果输出中不存在顶级目录,它将无法复制子目录和文件。您的意思是它不会复制顶级目录中的文件吗?看起来确实如此,只需扫描代码即可。 (就个人而言,我更喜欢递归解决方案,而不是依赖string.Replace() 或其他路径操作,但这里的代码看起来足够合理)。
  • @PeterDuniho 未创建目录“Program”,但其中的文件和文件夹已复制到目标位置。我需要在输出中获取“程序”目录。
  • 我相信这是重复的问题。看看这个问题的 MSDN 解决方案(我认为它是最后一个) - 它应该复制所有内容,包括目录本身。 Copy directory c#
  • @DotNet:它应该可以正常工作,如果您设置newPath 以便它实际上是您希望输出到的名为Program 的输出目录。在最坏的情况下,您只需将 newPath = Path.Combine(newPath, Path.GetFileName(sourcedirectory)) 添加到代码中,就在第一个 foreach 之前。
  • @ZivWeissman 这不是一个重复的问题。我使用的方法与您提到的问题的其中一个答案中的方法相同。

标签: c# .net


【解决方案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);
}

【讨论】:

    【解决方案2】:

    你可以使用递归函数来做到这一点:

    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);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 2016-07-23
      • 2014-06-20
      相关资源
      最近更新 更多