2009-03-24 4 views
14

Je dois copier le dossier C: \ FromFolder à C: \ ToFolderdossiers à copier dans C# à l'aide de System.IO

Voici le code qui coupera mon FromFolder et va créer mon ToFolder. Donc, mon FromFolder sera parti et tous les éléments seront dans le dossier nouvellement créé appelé ToFolder

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

Mais je veux simplement copier les fichiers dans FromFolder à ToFolder. Pour une raison quelconque, il n'y a pas de System.IO.Directory.Copy ???

Comment cela se fait à l'aide d'un fichier batch - Très facile

xcopy C: \ FromFolder C: \ ToFolder

Cordialement Etienne

Répondre

17

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)) 
{ 
    string[] files = System.IO.Directory.GetFiles(sourcePath); 

    // Copy the files and overwrite destination files if they already exist. 
    foreach (string 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); 
    } 
} 
18

il y a une copie de fichier. dossier Recréer et copiez tous les fichiers du répertoire d'origine vers le nouveau example

static void Main(string[] 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. 
      string destinationDir = Path.Combine(destination.FullName, dir.Name); 

      // Call CopyDirectory() recursively. 
      CopyDirectory(dir, new DirectoryInfo(destinationDir)); 
     } 
    } 
2

Vous devrez créer un nouveau répertoire à partir de zéro en boucle puis à travers tous les fichiers dans le répertoire source et les copier.

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

Je repars en train de créer le répertoire de destination pour vous :-)

+0

La solution la plus simple de loin! Merci! – agleno

1

This article provides an alogirthm to copy recursively some folder and all its content

de l'article:

Malheureusement, il n'y a aucune fonction intégrée dans System.IO que va copier un dossier et son contenu. Voici un algorithme récursif simple qui copie un dossier, ses sous-dossiers et fichiers, en créant le dossier de destination si nécessaire. Pour simplifier, il n'y a pas de gestion des erreurs; une exception sera lancée si quelque chose ne va pas, comme des chemins NULL ou invalides ou si les fichiers de destination existent déjà.

Bonne chance!

2

Vous avez 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. La copie d'un dossier peut potentiellement prendre beaucoup de temps, alors que le déplacement d'un dossier (sur le même lecteur) ne l'est pas. Je suppose que Microsoft pensait qu'il ferait un devoir de copier fichier par fichier, de sorte que vous puissiez ensuite afficher des informations de progression. Vous pouvez parcourir les fichiers dans un répertoire en créant une instance de DirectoryInfo et 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.

5

Copie de répertoires (correctement) est en fait une tâche assez complexe, surtout si vous prenez en compte le système de fichiers avancé techniques comme les jonctions et les liens durs. Votre meilleur pari est d'utiliser une API qui le supporte. Si vous n'avez pas peur d'un petit P/Invoke, SHFileOperation dans shell32 est votre meilleur pari. Une autre alternative serait d'utiliser la méthode Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory dans l'assembly Microsoft.VisualBasic (même si vous n'utilisez pas VB).

0

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")); 
+0

Quelle est la profondeur de la structure de dossier de cette copie? Il semble qu'il ne copiera que des sous-dossiers et non des sous-sous-dossiers. Il semble que la solution @RvdK soit la seule qui soit récursive. – Jag

+0

Ceci est récursif @Jag, dans le dernier foreach DirectoryInfo utilisé pour interat les sous-répertoires utilise la même extension "CopyTo". ; P – diegodsp

+0

Ah oui, je suis corrigé. Doit d'avoir eu un moment blond :) – Jag

0

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

using System; 
using System.IO; 

// ... 
    static void Main(string[] args) 
    { 
     Console.ForegroundColor = ConsoleColor.Cyan; 
     Console.Write("Copying... "); 

     DeepCopy(@"C:\Books", @"D:\Books"); 

     Console.WriteLine("Completed"); 

     Console.ForegroundColor = ConsoleColor.Gray; 
     Console.Write("Press any key to quit . . . "); 
     Console.ReadKey(true); 
    } 

    static void DeepCopy(string destination, string source) 
    { 
     Directory.CreateDirectory(destination); 

     string[] files = Directory.GetFiles(source); 
     foreach (string filepath in files) 
     { 
      int fileindex = filepath.LastIndexOf('\\'); 
      string filename = filepath.Substring(fileindex); 

      Copy(destination + filename, filepath); 
     } 

     string[] directories = Directory.GetDirectories(source); 
     foreach (string directory in directories) 
     { 
      int subdirindex = directory.LastIndexOf('\\'); 
      string subdirname = directory.Substring(subdirindex); 
      string structure = destination + subdirname; 

      DeepCopy(structure, directory); 
     } 
    } 

    static void Copy(string destination, string source, bool overwrite = false) 
    { 
     if (overwrite == true) 
      if (File.Exists(destination)) 
       File.Delete(destination); 

     if (File.Exists(destination)) 
      return; 

     using (Stream filereader = File.OpenRead(source)) 
     using (Stream filewriter = File.OpenWrite(destination)) 
     { 
      int readlength = 0; 
      byte[] buffer = new byte[1048576]; 
      while (filereader.Length != filewriter.Length) 
      { 
       readlength = filereader.Read(buffer, 0, 1048576); 
       filewriter.Write(buffer, 0, readlength); 
      } 
     } 
    } 
2

Une fonction simple qui copie le contenu entier du dossier source dans le dossier de destination et crée le dossier de destination si elle n'existe pas

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