2014-11-07 139 views
0

我想复制一个目录到另一个路径。
我发现这个方法,但它不会复制它里面的目录,只有子目录和文件:复制目录与所有文件和文件夹

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

我怎样才能获得“程序”文件夹中的所有文件和子文件夹输出?

+0

你是什么意思“,它不复制目录“?它明显地复制了目录本身 - 如果顶级目录不存在于输出中,它将无法复制子目录和文件。你的意思是它不复制顶级目录中的文件?看起来确实如此,只是扫描代码。 (就我个人而言,我更喜欢递归解决方案,而不是依赖'string.Replace()'或其他路径操作,但这里的代码看起来足够合理)。 – 2014-11-07 01:19:46

+0

@PeterDuniho目录“程序”未创建,但其中的文件和文件夹被复制到目标。我需要在输出中获得“程序”目录。 – DotNet 2014-11-07 01:28:12

+0

我相信这是重复的问题。 看看这个问题的MSDN解决方案(我认为这是最后一个) - 它应该复制所有,包括目录本身。 [Copy directory c#](http://stackoverflow.com/questions/58744/best-way-to-copy-the-entire-contents-of-a-directory-in-c-sharp) – 2014-11-07 01:39:35

回答

0

如果您在开始复印前调整输出路径,它应该工作:

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

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

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); 
    } 
相关问题