Hmm, creo que entienden mal la pregunta, pero voy a correr el riesgo. ¿Qué hay de malo en el siguiente sencillo método?
public static void CopyFilesRecursively(DirectoryInfo source, DirectoryInfo target) {
foreach (DirectoryInfo dir in source.GetDirectories())
CopyFilesRecursively(dir, target.CreateSubdirectory(dir.Name));
foreach (FileInfo file in source.GetFiles())
file.CopyTo(Path.Combine(target.FullName, file.Name));
}
EDITAR Desde esta publicación se ha ganado un número impresionante de downvotes para una respuesta tan simple de un igualmente simple pregunta, permítanme añadir una explicación. Por favor,lea esto antes de la votación negativa.
En primer lugar, Este código no está intendend como un reemplazo directo al código en la pregunta. Es solo para fines ilustrativos.
Microsoft.VisualBasic.Devices.Computer.FileSystem.CopyDirectory
realiza algunas pruebas de corrección adicionales (por ejemplo, si el origen y el destino son directorios válidos, si el origen es un elemento primario del destino, etc.) que faltan en esta respuesta. Ese código probablemente también esté más optimizado.
Dicho esto, el código funciona bien. Es tiene (casi idénticamente) se ha utilizado en un software maduro durante años. Además de la inconstancia inherente presente con todas las manipulaciones IO (por ejemplo, ¿qué pasa si el usuario desenchufa manualmente la unidad USB mientras el código está escribiendo en ella?), No hay problemas conocidos.
En particular, me gustaría señalar que el uso de recursividad aquí no es un problema en absoluto. Ni en teoría (conceptualmente, es la solución más elegante) ni en la práctica: este código no se desbordará en la pila. La pila es lo suficientemente grande como para manejar incluso jerarquías de archivos anidados profundamente. Mucho antes de que el espacio de la pila se convierta en un problema, la limitación de longitud de la ruta de la carpeta entra en acción.
Observe que un usuario malintencionado podría ser capaz de romper esta suposición mediante el uso de directorios profundamente anidados de una letra cada uno. No he intentado esto. Pero solo para ilustrar el punto: para hacer que este código se desborde en una computadora típica, los directorios tendrían que estar anidados unos pocos mil veces. Esto simplemente no es un escenario realista.
diría que mirando las alternativas publican a continuación, que la forma de VB no se ve tan feo. –
La verdadera pregunta es, ¿por qué no está esto en la biblioteca IO predeterminada? Por ahora, probablemente todos hayamos puesto el mismo código en nuestra biblioteca personal. –
¿Cómo puede ser un truco cuando es parte de .NET Framework? Deja de escribir código y usa lo que tienes. – AMissico