2012-04-30 18 views
6

Sto provando a creare una funzione che copierà ricorsivamente una cartella di origine e tutti i file e le cartelle all'interno di essa in una posizione diversa.Come creare una funzione ricorsiva per copiare tutti i file e le cartelle

Al momento, devo definire ogni cartella all'interno della cartella principale, che sta rendendo il codice gonfio e ridondante.

Qual è un modo più efficiente per farlo?

+1

più efficiente rispetto [missing code/dettagli]? –

+0

possibile duplicato di [Qual è il modo migliore per copiare ricorsivamente i contenuti in C#?] (Http://stackoverflow.com/questions/627504/what-is-the-best-way-to-recursively-copy-contents-in -c) – nawfal

+0

MSDN ha un esempio: [How to: Copy Directories] (http://msdn.microsoft.com/en-us/library/bb762914.aspx). – BluesRockAddict

risposta

4

Fonte: 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

Genera un'eccezione se la directory di destinazione ("dest" alla riga 17) non esiste. Inserire questo on line 18: if (! Directory.Exists (dest)) Directory.CreateDirectory (dest); – GojiraDeMonstah

9

dare un'occhiata alla mia domanda:

performance of copying directories ho usato foreach parallelo ed è molto veloce

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

Utilizzando GetDirectories/GetFiles è un po 'fuori di data nei miei occhi, vorrei usare Directory.EnumerateFileSystemEntries(source); invece come è più veloce.

1

farlo in questo modo

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