Tip/Trick: Cómo copiar una carpeta

Esta mañana necesitaba copiar un directorio en otro, pero me encontré con un «pequeño problema» (estamos mal acostumbrados con el framework). El caso es que System.IO.FileInfo tiene un método CopyTo() para copiar en otro directorio, por lo que nosotros podríamos pensar que System.IO.DirectoryInfo tendría el equivalente para directorio pero no, así que tenemos que crear nosotros el nuestro y esto fue lo que hice:

public void CopyDirectory(string From, string To)
{
    //Creamos el directorio de la aplicacion
    DirectoryInfo dir = new DirectoryInfo(From);

    //Creamos la ruta del directorio donde vamos a copiar
    string _directory = to + «\» + dir.Name;

    //Creamos el directorio
    Directory.CreateDirectory(_directory);

    //Recorremos todos los archivos
    foreach (FileInfo _file in dir.GetFiles())
    {
        //Copiamos el archivo en el directorio
        _file.CopyTo(_directory);
    }

    //Recorremos todos sus directorios
    foreach (DirectoryInfo _dir in dir.GetDirectories())
    {
        //Repetimos lo mismo para el siguiente subdirectorio
        CopyDirectory(_dir.FullName, _directory);
    }
}

Espero que os sea útil.

Un saludo

13 thoughts on “Tip/Trick: Cómo copiar una carpeta

  1. Consejillo para que quede del todo chulo. En lugar de:
    string _directory = to + «\» + dir.Name;
    usa:
    string _directory = Path.Combine(to, dir.Name);

    Automáticamente te añade el DirectorySeparatorChar correcto él solito (y el código se vuelve compatible con Mono).

    Nunca se me había dado el caso de tener que copiar una carpeta a otro lado, que cutres que no tengan algo asi montado 😛

    Salu2!

  2. Al fin me has hecho caso y has comenzado a poner material tuyo en vez de copiar/traducir de otros. Sin embargo, te haré unas sugerencias para cuando pegues código en tu blog:

    1.- No es necesarios comentar linea por linea, salvo que se esté haciendo algo que sea difícilmente comprensible. Es recomendable crear en su lugar un resumen al comienzo de la función.

    2.- En general, para hacer código similar al framework, utiliza parámetros en notación CamelCase.

    3.- A pesar del comentario de Kartones, también puedes utilizar «/» como separador de directorios bajo Windows y funciona perfectamente (no se queja). Aunque nunca está de más utilizar el PathSeparatorChar.

    4.- OPCIONAL. No sé si lo sabrás (puesto que eres del VB), pero NO es necesario poner las llaves { } en C# si solo tienes una instrucción en los foreach, if-else, for, while, …

    5.- OPCIONAL. Las variables locales de una clase es mejor que no vayan precedidas por el símbolo «_», ya que se suele reservar para las miembros de una clase.

    Ánimo y sigue así, que vas por el buen camino.

  3. Gracias a todos pos los comentarios [:D]. Menos a Vargas que critica demasiado, jejeje

    Pd: Es broma hombre, sigue criticando que de las críticas uno aprende

  4. Que tal, la verdad se me ha hecho muy bueno el truco, yo me he topado con el problema de que no me quiere reconocer el CopyDirectory, estoy desarrollando asp.net en VB. aparte aunque ya hice los
    Imports System.IO.Directory
    Imports System.IO.FileInfo
    Imports System.IO.File
    Imports System.IO.Directoryinfo

    no puedo utilizar lo que hay dentro de cada uno de esos espacios. espero me puedas indicar en que me estoy equivocando.

    gracias por tu tiempo y atencion

  5. Yo se que se pueden copiar carpetas pero si no tenes archivos pr dentro te copian, el problema es que si tenes archivos dentro de la carpeta no copia, sera que el codigo que se subio es ese?,

  6. hola lo que pasa es que necesito hacer casi lo mismo que el pero copiar las carpetas de un lugar del directorio y pasarlas a otro y ademas preguntar si el archivo existe espero que me puedan ayudar soy nuevo en este rubro de programadores saludos gracias

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *