2012-04-30 95 views
6

Tôi đang cố gắng tạo một hàm sao chép đệ quy thư mục nguồn và tất cả các tệp và thư mục bên trong nó đến một vị trí khác.Cách tạo một hàm đệ quy để sao chép tất cả các tệp và thư mục

Hiện tại, tôi phải xác định từng thư mục trong thư mục chính, điều này làm cho mã bị cồng kềnh và dư thừa.

Cách hiệu quả hơn để thực hiện việc này là gì?

+1

More hiệu quả hơn [thiếu mã/chi tiết]? –

+0

bản sao có thể có của [Cách tốt nhất để sao chép nội dung đệ quy trong C#?] (Http://stackoverflow.com/questions/627504/what-is-the-best-way-to-recursively-copy-contents-in -c) – nawfal

+0

MSDN có một ví dụ: [Cách thực hiện: Sao chép thư mục] (http://msdn.microsoft.com/en-us/library/bb762914.aspx). – BluesRockAddict

Trả lời

4

Nguồn: 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

Ném ngoại lệ nếu thư mục đích ("dest" trên dòng 17) không tồn tại. Chèn dòng này vào dòng 18: nếu (! Directory.Exists (dest)) Directory.CreateDirectory (dest); – GojiraDeMonstah

9

hãy nhìn vào câu hỏi của tôi:

performance of copying directories i sử dụng foreach song song và nó là rất nhanh

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

Sử dụng GetDirectories/GetFiles là hơi ra trong mắt tôi, tôi sẽ sử dụng Directory.EnumerateFileSystemEntries(source); thay vì nó nhanh hơn.

1

Hãy làm theo cách này

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))); 
} 
Các vấn đề liên quan