2010-06-01 19 views
6

Come si copia una directory in un'unità diversa in C#?Copia una directory in un'unità diversa

+2

lol, che cosa? Scusa se non prendere in giro nessuno ha pensato che questa domanda sia esilarante nel modo in cui viene richiesta :) – VoodooChild

+0

Capisco che la domanda abbia avuto risposta, ma dovresti provare a migliorare la qualità della domanda. Non è scritto molto bene. –

+3

Penso che abbiamo bisogno di un nuovo motivo per chiudere - 'facile trovare se l'OP fa lo sforzo' – Gishu

risposta

16

È possibile utilizzare questo codice per eseguire la vostra operazione:

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

sotto uno è anche un bene:

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

è possibile utilizzare questa funzione anche:

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

FileSystem.CopyDirectory è in uno spazio dei nomi VB e l'assemblaggio, ma che probabilmente non importa.

+0

purtroppo non funziona su tutti i volumi – Crash893

+0

@ Crash893 Sì. –

+0

@KyleDelaney sì lo fa ora (sono passati 7 anni da quando ho postato questo) – 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

È molto più semplice per gli altri leggere la tua risposta se si formatta il codice correttamente. Inoltre, è meglio aggiungere un po 'di contesto al tuo codice. Scrivi sul motivo per cui pensi che questa sia una buona risposta o che cosa faccia in modo diverso rispetto alle altre risposte. – mdewitt

2

Ecco un'estensione che funzionerà in .NET 4.0+

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

Includere questo file nel tuo progetto

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

Ecco un approccio che copia una directory ricorsivamente come una funzione 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); 
} 
Problemi correlati