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
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!
PingBack desde University Update-C#-Tip/Trick: C??mo copiar una carpeta
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.
Yo añadiría algo más, comprobar que el directorio de origen existe:
if (Directory.Exists(from))
{
…
}
Salu2
Rafael Vargas:
las llaves { } aún cuando tengamos 1 instrucción son una «best practice» a la hora de codificar en C#
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
Rafael,
He visto muchos bugs que salen por no usar { } para instrucciones de una sola línea.
Vargas, te has convertido en un troll… xD
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
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?,
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
deberian enseñar mas conceptos
espacifiquen no quiero enterarme la vida de nadie