2012-04-30 23 views
6

Estoy intentando crear una función que copiará recursivamente una carpeta fuente y todos los archivos y carpetas dentro de ella a una ubicación diferente.Cómo crear una función recursiva para copiar todos los archivos y carpetas

Por el momento, tengo que definir cada carpeta dentro de la carpeta principal, lo que hace que el código se hinche y sea redundante.

¿Cuál es una forma más eficiente de hacer esto?

+1

Más eficiente que [code]/detalles que faltan? –

+0

posible duplicado de [¿Cuál es la mejor manera de copiar recursivamente los contenidos en C#?] (Http://stackoverflow.com/questions/627504/what-is-the-best-way-to-recursively-copy-contents-in -c) – nawfal

+0

MSDN tiene un ejemplo: [Cómo copiar directorios] (http://msdn.microsoft.com/en-us/library/bb762914.aspx). – BluesRockAddict

Respuesta

4

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

Lanza una excepción si el directorio de destino ("dest" en la línea 17) no existe. Inserte esto en la línea 18: if (! Directory.Exists (dest)) Directory.CreateDirectory (dest); – GojiraDeMonstah

9

echar un vistazo a mi pregunta:

performance of copying directories i utilizado foreach paralelo y es muy rápido

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

Usando GetDirectories/GetFiles es algo fuera de la fecha en mi opinión, usaría Directory.EnumerateFileSystemEntries(source);, ya que es más rápido.

1

hacerlo de esta manera

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