Tip/Trick: Cómo copiar una carpeta

Published 23/8/2007 23:40 | Eugenio Estrada

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

Archivado en: ,
Comparte este post:

Comentarios

# Kartones said on August 24, 2007 12:39 AM:

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

Salu2!

# University Update-C#-Tip/Trick: C??mo copiar una carpeta said on August 24, 2007 11:10 AM:

PingBack desde  University Update-C#-Tip/Trick: C??mo copiar una carpeta

# Rafael Vargas said on August 24, 2007 12:29 PM:

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.

# Luis Ruiz Pavón said on August 24, 2007 1:50 PM:

Yo añadiría algo más, comprobar que el directorio de origen existe:

       if (Directory.Exists(from))

       {

           ...

       }

Salu2

# RR said on August 24, 2007 5:27 PM:

Rafael Vargas:

las llaves { } aún cuando tengamos 1 instrucción son una "best practice" a la hora de codificar en C#

# Eugenio Estrada said on August 24, 2007 5:50 PM:

Gracias a todos pos los comentarios Big Smile. Menos a Vargas que critica demasiado, jejeje

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

# Anonimo said on August 25, 2007 6:27 PM:

Rafael,

He visto muchos bugs que salen por no usar { } para instrucciones de una sola línea.

# Miguel LLopis said on August 26, 2007 9:42 AM:

Vargas, te has convertido en un troll... xD

# Ricmen said on September 19, 2007 8:43 PM:

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

# Jose Florez said on February 19, 2008 11:14 PM:

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?,

# krretero said on March 11, 2008 9:49 PM:

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

# ma said on July 1, 2008 7:15 PM:

deberian enseñar mas conceptos

# alexa said on July 8, 2008 6:43 PM:

espacifiquen no quiero enterarme la vida de nadie

Search

This Blog

Tags

Community

Archives

Blogs

Enlaces recomendados

Syndication

Email Notifications

Enlaces Comunes