2010-06-01 69 views
6

Làm cách nào để sao chép thư mục sang ổ đĩa khác trong C#?Sao chép thư mục sang một ổ đĩa khác

+2

lol, những gì? Xin lỗi, đừng làm bất cứ ai nghĩ rằng câu hỏi này là vui nhộn theo cách nó được hỏi :) – VoodooChild

+0

Tôi hiểu rằng câu hỏi đã được trả lời, nhưng bạn nên thử và cải thiện chất lượng của câu hỏi. Nó không được viết rất tốt. –

+3

Tôi nghĩ chúng ta cần một lý do mới để đóng - 'dễ tìm nếu OP làm nỗ lực' – Gishu

Trả lời

16

Bạn có thể sử dụng mã này để thực hiện hoạt động của bạn:

public static void CopyAll(DirectoryInfo source, DirectoryInfo target) 
{ 
    // Check if the target directory exists, if not, create it. 
    if (Directory.Exists(target.FullName) == false) 
    { 
     Directory.CreateDirectory(target.FullName); 
    } 

    // Copy each file into it’s new directory. 
    foreach (FileInfo fi in source.GetFiles()) 
    { 
     Console.WriteLine(@”Copying {0}\{1}”, target.FullName, fi.Name); 
     fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true); 
    } 

    // Copy each subdirectory using recursion. 
    foreach (DirectoryInfo diSourceSubDir in source.GetDirectories()) 
    { 
     DirectoryInfo nextTargetSubDir = 
      target.CreateSubdirectory(diSourceSubDir.Name); 
     CopyAll(diSourceSubDir, nextTargetSubDir); 
    } 
} 

dưới một cũng tốt:

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

bạn có thể sử dụng chức năng này cũng:

FileSystem.CopyDirectory(sourceDir, destDir); 
5
FileSystem.CopyDirectory(sourceDir, destDir); 

FileSystem.CopyDirectory nằm trong không gian tên và lắp ráp VB, nhưng điều đó có thể không quan trọng.

+0

điều này không hoạt động trên khối lượng không may – Crash893

+0

@ Crash893 Có. –

+0

@KyleDelaney có nó hiện nay (đã được 7 năm kể từ khi tôi đăng này) – Crash893

0
private String path; 
    public int copyAllContents(String destinationFolder, ProgressBar progressBar) 
    { 
     int countCopyFiles = 0; 
     if (!Directory.Exists(destinationFolder)) 
     { Directory.CreateDirectory(destinationFolder); } 
     String[] allFilesForCurrentFolder = Directory.GetFiles(path, "*.*", SearchOption.TopDirectoryOnly); 
     String[] subFoldersAllpath = Directory.GetDirectories(path); 
     for (int i = 0; i < allFilesForCurrentFolder.Length; i++) 
     { 
      try { File.Copy(allFilesForCurrentFolder[i], destinationFolder + "\\" + Path.GetFileName(allFilesForCurrentFolder[i])); countCopyFiles++; progressBar.Value++; } 
      catch (Exception ex) { Console.WriteLine(ex.Message.ToString()); } 
     } 
     if (subFoldersAllpath.Length == 0) 
     { return allFilesForCurrentFolder.Length; }; 
     for (int i = 0; i < subFoldersAllpath.Length; i++) 
     { 
      this.path = subFoldersAllpath[i]; 
      String[] subFoldersAllpathLastFolder = subFoldersAllpath[i].Split('\\'); 
      countCopyFiles += this.copyAllContents(destinationFolder + "\\" + subFoldersAllpathLastFolder[subFoldersAllpathLastFolder.Length - 1], progressBar); 
     } 
     return countCopyFiles; 
    } 
+0

Sẽ dễ dàng hơn cho những người khác đọc câu trả lời của bạn nếu bạn định dạng mã đúng cách. Ngoài ra, tốt nhất là thêm một số ngữ cảnh vào mã của bạn. Viết về lý do tại sao bạn cho rằng đây là câu trả lời hay hay câu trả lời khác so với các câu trả lời khác. – mdewitt

2

Dưới đây là một phần mở rộng sẽ làm việc trong .NET 4.0+

var source = new DirectoryInfo(@"C:\Test"); 
var destination = new DirectoryInfo(@"E:\Test"); 
source.CopyTo(destination); 

Bao gồm tệp này trong dự án của bạn

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 

namespace System.IO 
{ 
    public static class DirectoryInfoExtensions 
    { 
    public static void CopyTo(this DirectoryInfo source, DirectoryInfo target) 
    { 
     if (!target.Exists) 
     target.Create(); 

     foreach (var file in source.GetFiles()) 
     file.CopyTo(Path.Combine(target.FullName, file.Name), true); 

     foreach (var subdir in source.GetDirectories()) 
     subdir.CopyTo(target.CreateSubdirectory(subdir.Name)); 
    } 
    } 
} 
0

Dưới đây là một phương pháp sao chép một thư mục đệ quy như một chức năng async:

public static async Task CopyDirectoryAsync(string sourceDirectory, string destinationDirectory) 
{ 
    if (!Directory.Exists(destinationDirectory)) 
     Directory.CreateDirectory(destinationDirectory); 

    foreach (var file in Directory.GetFiles(sourceDirectory)) 
    { 
     var name = Path.GetFileName(file); 
     var dest = Path.Combine(destinationDirectory, name); 
     await CopyFileAsync(file, dest); 
    } 

    foreach (var subdir in Directory.GetDirectories(sourceDirectory)) 
    { 
     var name = Path.GetFileName(subdir); 
     var dest = Path.Combine(destinationDirectory, name); 
     await CopyDirectoryAsync(subdir, dest); 
    } 
} 

public static async Task CopyFileAsync(string sourceFile, string destinationFile) 
{ 
    using (var sourceStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.Asynchronous | FileOptions.SequentialScan)) 
    using (var destinationStream = new FileStream(destinationFile, FileMode.CreateNew, FileAccess.Write, FileShare.None, 4096, FileOptions.Asynchronous | FileOptions.SequentialScan)) 
     await sourceStream.CopyToAsync(destinationStream); 
} 
Các vấn đề liên quan