Copier des dossiers en C # à l’aide de System.IO

J’ai besoin de copier le dossier C: \ FromFolder vers C: \ ToFolder

Ci-dessous est le code qui va couper mon FromFolder, puis va créer mon ToFolder. Donc, mon dossier de départ aura disparu et tous les éléments seront dans le dossier nouvellement créé appelé ToFolder.

System.IO.Directory.Move(@"C:\FromFolder ", @"C:\ToFolder"); 

Mais je veux juste copier les fichiers de FromFolder vers ToFolder. Pour une raison quelconque, il n’y a pas de System.IO.Directory.Copy ???

Comment cela se fait-il à l’aide d’un fichier de commandes – Très facile

xcopy C: \ FromFolder C: \ ToFolder

Cordialement Etienne

Ce lien fournit un bel exemple.

http://msdn.microsoft.com/en-us/library/cc148994.aspx

Voici un extrait

 // To copy all the files in one directory to another directory. // Get the files in the source folder. (To recursively iterate through // all subfolders under the current directory, see // "How to: Iterate Through a Directory Tree.") // Note: Check for target path was performed previously // in this code example. if (System.IO.Directory.Exists(sourcePath)) { ssortingng[] files = System.IO.Directory.GetFiles(sourcePath); // Copy the files and overwrite destination files if they already exist. foreach (ssortingng s in files) { // Use static Path methods to extract only the file name from the path. fileName = System.IO.Path.GetFileName(s); destFile = System.IO.Path.Combine(targetPath, fileName); System.IO.File.Copy(s, destFile, true); } } 

il y a une copie du fichier. Recréer le dossier et copier tous les fichiers du répertoire d’origine dans le nouveau exemple

 static void Main(ssortingng[] args) { DirectoryInfo sourceDir = new DirectoryInfo("c:\\a"); DirectoryInfo destinationDir = new DirectoryInfo("c:\\b"); CopyDirectory(sourceDir, destinationDir); } static void CopyDirectory(DirectoryInfo source, DirectoryInfo destination) { if (!destination.Exists) { destination.Create(); } // Copy all files. FileInfo[] files = source.GetFiles(); foreach (FileInfo file in files) { file.CopyTo(Path.Combine(destination.FullName, file.Name)); } // Process subdirectories. DirectoryInfo[] dirs = source.GetDirectories(); foreach (DirectoryInfo dir in dirs) { // Get destination directory. ssortingng destinationDir = Path.Combine(destination.FullName, dir.Name); // Call CopyDirectory() recursively. CopyDirectory(dir, new DirectoryInfo(destinationDir)); } } 

Copier des répertoires (correctement) est en fait une tâche plutôt complexe, surtout si vous prenez en compte des techniques de système de fichiers avancées telles que les jonctions et les liens physiques. Votre meilleur pari est d’utiliser une API qui la supporte. Si vous n’avez pas peur d’un peu de P / Invoke, SHFileOperation dans shell32 est votre meilleur pari. Une autre alternative consiste à utiliser la méthode Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory dans l’assembly Microsoft.VisualBasic (même si vous n’utilisez pas VB).

Oui, tu as raison.

http://msdn.microsoft.com/en-us/library/system.io.directoryinfo.aspx

a fourni une fonction de copie .. ou vous pouvez utiliser une autre fonction

http://msdn.microsoft.com/en-us/library/ms127960.aspx

Vous devrez créer un nouveau répertoire à partir de rien, parcourir tous les fichiers du répertoire source et les copier.

 ssortingng[] files = Directory.GetFiles(GlobalVariables.mstrReadsWellinPath); foreach(ssortingng s in files) { fileName=Path.GetFileName(s); destFile = Path.Combine(DestinationPath, fileName); File.Copy(s, destFile); } 

Je vous laisse la création du répertoire de destination 🙂

Tu as raison. Il n’y a pas de méthode Directory.Copy. Ce serait une méthode très puissante, mais aussi dangereuse, pour le développeur sans méfiance. Copier un dossier peut éventuellement être une opération très fastidieuse, alors que déplacer un dossier (sur le même lecteur) ne l’est pas.

J’imagine que Microsoft pensait qu’il serait judicieux de copier fichier par fichier afin que vous puissiez ensuite afficher certaines informations sur les progrès. Vous pouvez parcourir les fichiers d’un répertoire en créant une instance de DirectoryInfo, puis en appelant GetFiles (). Pour inclure également des sous-répertoires, vous pouvez également appeler GetDirectories () et les énumérer avec une méthode récursive.

Une fonction simple qui copie l’intégralité du contenu du dossier source dans le dossier de destination et crée le dossier de destination s’il n’existe pas.

 class Utils { internal static void copy_dir(ssortingng source, ssortingng dest) { if (Ssortingng.IsNullOrEmpty(source) || Ssortingng.IsNullOrEmpty(dest)) return; Directory.CreateDirectory(dest); foreach (ssortingng fn in Directory.GetFiles(source)) { File.Copy(fn, Path.Combine(dest, Path.GetFileName(fn)), true); } foreach (ssortingng dir_fn in Directory.GetDirectories(source)) { copy_dir(dir_fn, Path.Combine(dest, Path.GetFileName(dir_fn))); } } } 

Cet article fournit un alogirthm pour copier récursivement un dossier et tout son contenu.

De l’article:

Malheureusement, System.IO ne contient aucune fonction intégrée permettant de copier un dossier et son contenu. Voici un algorithme récursif simple qui copie un dossier, ses sous-dossiers et ses fichiers, créant le dossier de destination si nécessaire. Pour des raisons de simplicité, il n’ya pas de traitement des erreurs; une exception sera levée si quelque chose ne va pas, comme des chemins nuls ou non valides ou si les fichiers de destination existent déjà.

Bonne chance!

Ma version de DirectoryInfo.CopyTo utilisant l’extension.

 public static class DirectoryInfoEx { public static void CopyTo(this DirectoryInfo source, DirectoryInfo target) { if (source.FullName.ToLower() == target.FullName.ToLower()) return; if (!target.Exists) target.Create(); foreach (FileInfo f in source.GetFiles()) { FileInfo newFile = new FileInfo(Path.Combine(target.FullName, f.Name)); f.CopyTo(newFile.FullName, true); } foreach (DirectoryInfo diSourceSubDir in source.GetDirectories()) { DirectoryInfo nextTargetSubDir = target.CreateSubdirectory(diSourceSubDir.Name); diSourceSubDir.CopyTo(nextTargetSubDir); } } } 

Et utiliser comme ça …

 DirectoryInfo d = new DirectoryInfo("C:\Docs"); d.CopyTo(new DirectoryInfo("C:\New")); 

Ce code permet à l’utilisateur de copier le contenu d’un répertoire dans un autre.

 using System; using System.IO; // ... static void Main(ssortingng[] args) { Console.ForegroundColor = ConsoleColor.Cyan; Console.Write("Copying... "); DirectoryCopy(@"D:\Projects\Lloyds", @"C:\Lloyds"); Console.WriteLine("Completed"); Console.ForegroundColor = ConsoleColor.Gray; Console.Write("Press any key to quit . . . "); Console.ReadKey(true); } static void DirectoryCopy(ssortingng source, ssortingng destination) { Directory.CreateDirectory(destination); DirectoryInfo sourceDirectory = new DirectoryInfo(source); foreach (FileInfo file in sourceDirectory.GetFiles()) File.Copy(file.FullName, Path.Combine(destination, file.Name)); foreach (DirectoryInfo directory in sourceDirectory.GetDirectories()) DirectoryCopy(directory.FullName, Path.Combine(destination, directory.Name)); }