Hmm, creo que no he entendido bien la pregunta, pero voy a arriesgarme. ¿Qué tiene de malo el siguiente método sencillo?
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 Dado que esta publicación ha cosechado una cantidad impresionante de votos negativos para una respuesta tan simple a una pregunta igualmente simple, permítanme agregar una explicación. Por favor lea esto antes de votar abajo .
En primer lugar, este código no se incluye como un reemplazo directo del 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 padre 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 . Se ha utilizado (casi idénticamente) en un software maduro durante años. Además de la inconstancia inherente presente con todos los manejos de E / S (por ejemplo, ¿qué sucede si el usuario desconecta manualmente la unidad USB mientras su código está escribiendo en ella?), No hay problemas conocidos.
En particular, me gustaría señalar que el uso de la recursividad aquí no es absolutamente un problema. Ni en teoría (conceptualmente, es la solución más elegante) ni en la práctica: este código no desbordará la pila . La pila es lo suficientemente grande como para manejar incluso jerarquías de archivos profundamente anidadas. Mucho antes de que el espacio de pila se convierta en un problema, la limitación de longitud de la ruta de la carpeta entra en juego.
Tenga en cuenta que un usuario malintencionado podría romper esta suposición utilizando directorios profundamente anidados de una letra cada uno. No he intentado esto. Pero solo para ilustrar el punto: para que este código se desborde en una computadora típica, los directorios tendrían que anidarse unos miles de veces. Esto simplemente no es un escenario realista.