Copier des fichiers récursivement

J’ai trouvé un petit extrait pour faire une copie de fichier récursive en C #, mais je suis quelque peu perplexe. J’ai essentiellement besoin de copier une structure de répertoire vers un autre emplacement, dans le sens de ceci …

Source: C: \ data \ servers \ mc

Cible: E: \ mc

Le code pour ma fonction de copie à partir de maintenant est …

//Now Create all of the directories foreach (ssortingng dirPath in Directory.GetDirectories(baseDir, "*", SearchOption.AllDirectories)) { Directory.CreateDirectory(dirPath.Replace(baseDir, targetDir)); } // Copy each file into it's new directory. foreach (ssortingng file in Directory.GetFiles(baseDir, "*.*", SearchOption.AllDirectories)) { Console.WriteLine(@"Copying {0}\{1}", targetDir, Path.GetFileName(file)); if (!CopyFile(file, Path.Combine(targetDir, Path.GetFileName(file)), false)) { int err = Marshal.GetLastWin32Error(); Console.WriteLine("[ERROR] CopyFile Failed on {0} with code {1}", file, err); } } 

Le problème est que dans le deuxième champ d’application, j’ai soit:

  1. utilisez Path.GetFileName(file) pour obtenir le nom de fichier réel sans le chemin mais je perds la structure de répertoire “mc” ou
  2. utilisez “fichier” sans Path.Combine.

De toute façon, je dois faire un travail de cordes méchant. Y a-t-il un bon moyen de faire cela en C # (mon manque de connaissances avec l’API .NET me conduit à trop compliquer les choses)

au lieu de

 foreach (ssortingng file in Directory.GetFiles(baseDir, "*.*", SearchOption.AllDirectories)) { 

faire quelque chose comme ça

 foreach (FileInfo fi in source.GetFiles()) { fi.CopyTo(Path.Combine(target.ToSsortingng(), fi.Name), true); } 

MSDN a un exemple complet: Comment: copier des répertoires

 using System; using System.IO; class DirectoryCopyExample { static void Main() { // Copy from the current directory, include subdirectories. DirectoryCopy(".", @".\temp", true); } private static void DirectoryCopy(ssortingng sourceDirName, ssortingng destDirName, bool copySubDirs) { // Get the subdirectories for the specified directory. DirectoryInfo dir = new DirectoryInfo(sourceDirName); if (!dir.Exists) { throw new DirectoryNotFoundException( "Source directory does not exist or could not be found: " + sourceDirName); } DirectoryInfo[] dirs = dir.GetDirectories(); // If the destination directory doesn't exist, create it. if (!Directory.Exists(destDirName)) { Directory.CreateDirectory(destDirName); } // Get the files in the directory and copy them to the new location. FileInfo[] files = dir.GetFiles(); foreach (FileInfo file in files) { ssortingng temppath = Path.Combine(destDirName, file.Name); file.CopyTo(temppath, false); } // If copying subdirectories, copy them and their contents to new location. if (copySubDirs) { foreach (DirectoryInfo subdir in dirs) { ssortingng temppath = Path.Combine(destDirName, subdir.Name); DirectoryCopy(subdir.FullName, temppath, copySubDirs); } } } } 

Un remplacement non récursif pour cette réponse serait:

 private static void DirectoryCopy(ssortingng sourceBasePath, ssortingng destinationBasePath, bool recursive = true) { if (!Directory.Exists(sourceBasePath)) throw new DirectoryNotFoundException($"Directory '{sourceBasePath}' not found"); var directoriesToProcess = new Queue<(string sourcePath, string destinationPath)>(); directoriesToProcess.Enqueue((sourcePath: sourceBasePath, destinationPath: destinationBasePath)); while (directoriesToProcess.Any()) { (ssortingng sourcePath, ssortingng destinationPath) = directoriesToProcess.Dequeue(); if (!Directory.Exists(destinationPath)) Directory.CreateDirectory(destinationPath); var sourceDirectoryInfo = new DirectoryInfo(sourcePath); foreach (FileInfo sourceFileInfo in sourceDirectoryInfo.EnumerateFiles()) sourceFileInfo.CopyTo(Path.Combine(destinationPath, sourceFileInfo.Name), true); if (!recursive) continue; foreach (DirectoryInfo sourceSubDirectoryInfo in sourceDirectoryInfo.EnumerateDirectories(sourcePath)) directoriesToProcess.Enqueue(( sourcePath: sourceSubDirectoryInfo.FullName, destinationPath: Path.Combine(destinationPath, sourceSubDirectoryInfo.Name))); } }