Hmm, je pense avoir mal compris la question mais je vais la risquer. Quel est le problème avec la méthode simple suivante?
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));
}
EDIT Étant donné que cette publication a recueilli un nombre impressionnant de votes négatifs pour une réponse aussi simple à une question tout aussi simple, permettez-moi d'ajouter une explication. Veuillez lire ceci avant de voter .
Tout d'abord, ce code n'est pas destiné à remplacer le code de la question. C'est à des fins d'illustration uniquement.
Microsoft.VisualBasic.Devices.Computer.FileSystem.CopyDirectory
effectue des tests de correction supplémentaires (par exemple, si la source et la cible sont des répertoires valides, si la source est un parent de la cible, etc.) qui manquent dans cette réponse. Ce code est probablement aussi plus optimisé.
Cela dit, le code fonctionne bien . Il est (presque à l'identique) utilisé dans un logiciel mature depuis des années. À part l'inconstance inhérente présente avec toutes les manipulations d'E / S (par exemple, que se passe-t-il si l'utilisateur débranche manuellement la clé USB pendant que votre code y écrit?), Il n'y a aucun problème connu.
En particulier, je voudrais souligner que l'utilisation de la récursion ici n'est absolument pas un problème. Ni en théorie (conceptuellement, c'est la solution la plus élégante) ni en pratique: ce code ne débordera pas la pile . La pile est suffisamment grande pour gérer même les hiérarchies de fichiers profondément imbriquées. Bien avant que l'espace de pile ne devienne un problème, la limitation de la longueur du chemin d'accès au dossier entre en jeu.
Notez qu'un utilisateur malveillant pourrait être en mesure de briser cette hypothèse en utilisant des répertoires profondément imbriqués d'une lettre chacun. Je n'ai pas essayé ça. Mais juste pour illustrer le point: afin de faire déborder ce code sur un ordinateur typique, les répertoires devraient être imbriqués quelques milliers de fois. Ce n'est tout simplement pas un scénario réaliste.