2012-04-30 54 views
6

我想創建一個函數,它將遞歸地將源文件夾及其內的所有文件和文件夾複製到不同的位置。如何創建遞歸函數來複制所有文件和文件夾

目前,我必須定義主文件夾內的每個文件夾,這使得代碼變得臃腫和冗餘。

這樣做的更有效的方法是什麼?

+1

比[缺碼/詳細信息]更有效率? –

+0

可能重複[在C#中遞歸複製內容的最佳方式是什麼?](http://stackoverflow.com/questions/627504/what-is-the-best-way-to-recursively-copy-contents-in -c) – nawfal

+0

MSDN有一個例子:[如何:複製目錄](http://msdn.microsoft.com/en-us/library/bb762914.aspx)。 – BluesRockAddict

回答

4

來源:C# - Copy files and folders recursively from source to destination folder in c-sharp

public static void CopyFolder(string sourceFolder, string destFolder) 
{ 
    if (!Directory.Exists(destFolder)) 
     Directory.CreateDirectory(destFolder); 

    string[] files = Directory.GetFiles(sourceFolder); 
    foreach (string file in files) 
    { 
     string name = Path.GetFileName(file); 
     string dest = Path.Combine(destFolder, name); 
     File.Copy(file, dest); 
    } 
    string[] folders = Directory.GetDirectories(sourceFolder); 
    foreach (string folder in folders) 
    { 
     string name = Path.GetFileName(folder); 
     string dest = Path.Combine(destFolder, name); 
     CopyFolder(folder, dest); 
    } 
} 
+0

如果目標目錄(第17行中的「dest」)不存在,則會引發異常。如果(!Directory.Exists(dest)) Directory.CreateDirectory(dest);請將此行插入18: ; – GojiraDeMonstah

9

看看我的問題:

performance of copying directories 我用並行的foreach,它是非常快的

private static void CopyAll(string SourcePath, string DestinationPath) 
{ 

string[] directories = System.IO.Directory.GetDirectories(SourcePath, "*.*", SearchOption.AllDirectories); 

Parallel.ForEach(directories, dirPath => 
{ 
    Directory.CreateDirectory(dirPath.Replace(SourcePath, DestinationPath)); 
}); 

string[] files = System.IO.Directory.GetFiles(SourcePath, "*.*", SearchOption.AllDirectories); 

Parallel.ForEach(files, newPath => 
{ 
    File.Copy(newPath, newPath.Replace(SourcePath, DestinationPath)); 
}); 
} 
0

使用GetDirectories/GetFiles的是有些出在我眼裏的日期,我會用Directory.EnumerateFileSystemEntries(source);,因爲它更快。

1

做這種方式

void Copy(string sourceDir, string targetDir) 
{ 
    Directory.CreateDirectory(targetDir); 
    foreach (var file in Directory.GetFiles(sourceDir)) 
     File.Copy(file, Path.Combine(targetDir, Path.GetFileName(file))); 

    foreach (var directory in Directory.GetDirectories(sourceDir)) 
     Copy(directory, Path.Combine(targetDir, Path.GetFileName(directory))); 
} 
相關問題