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:
Path.GetFileName(file)
pour obtenir le nom de fichier réel sans le chemin mais je perds la structure de répertoire “mc” ou 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))); } }