2009-03-24 14 views
14

devo copiare la cartella C: \ FromFolder a C: \ ToFoldercartelle Copiare in C# utilizzando System.IO

Di seguito è riportato il codice che taglierà il mio FromFolder e poi sarà creare il mio ToFolder. Quindi il mio FromFolder sarà andato e tutti gli elementi saranno nella cartella appena creata denominata ToFolder

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

ma voglio solo per copiare i file in FromFolder a ToFolder. Per qualche motivo non c'è System.IO.Directory.Copy ???

Come questo viene fatto utilizzando un file batch - Molto facile

xcopy C: \ FromFolder C: \ ToFolder

saluti Etienne

risposta

17

Questo link fornisce un buon esempio.

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

Ecco un frammento

// 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

c'è una copia di file. cartella e ricreare copiare tutti i file dalla cartella originale a quella nuova 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

Avrai bisogno di creare una nuova directory da zero quindi scorrere tutti i file nella directory di origine e copiarli su.

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

Lascio la creazione della directory di destinazione per voi :-)

+0

La soluzione più semplice in assoluto! Grazie! – agleno

1

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

Dall'articolo:

Purtroppo non v'è alcuna funzione built-in in System.IO che copierà una cartella e il suo contenuto. Di seguito è riportato un semplice algoritmo ricorsivo che copia una cartella, le relative sottocartelle e file, creando la cartella di destinazione, se necessario. Per semplicità, non c'è gestione degli errori; verrà generata un'eccezione se qualcosa va storto, come percorsi nulli o non validi o se i file di destinazione esistono già.

Buona fortuna!

2

Hai ragione. Non esiste alcun metodo Directory.Copy. Sarebbe un metodo molto potente, ma anche pericoloso, per lo sviluppatore ignaro. Copiare una cartella può essere un'operazione che richiede molto tempo, mentre lo spostamento di una (sulla stessa unità) non lo è.

Immagino che Microsoft abbia pensato che sarebbe stato necessario copiare file per file, quindi è possibile visualizzare una sorta di informazioni sui progressi. È possibile eseguire iterazioni attraverso i file in una directory creando un'istanza di DirectoryInfo e quindi chiamando GetFiles(). Per includere anche le sottodirectory puoi anche chiamare GetDirectories() ed enumerarle attraverso un metodo ricorsivo.

5

directory Copia (correttamente) è in realtà un compito piuttosto complesso, soprattutto se si tiene conto del filesystem avanzato tecniche come giunzioni e collegamenti fisici. La soluzione migliore è utilizzare un'API che la supporti. Se non hai paura di un piccolo P/Invoke, SHFileOperation in shell32 è la soluzione migliore. Un'altra alternativa sarebbe utilizzare il metodo Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory nell'assembly Microsoft.VisualBasic (anche se non si utilizza VB).

0

La mia versione di DirectoryInfo.CopyTo che utilizza l'estensione.

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); 
     } 
    } 
} 

E utilizzare così ...

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

Quanto è profonda questa struttura di cartelle? Sembra che copi solo le sottocartelle, non le sottocartelle secondarie. Sembra che la soluzione @RvdK sia l'unica che è ricorsiva. – Jag

+0

Questo è ricorsivo @Jag, nell'ultimo foreach il DirectoryInfo utilizzato per le sottodirectory utilizza la stessa estensione "CopyTo". ; P – diegodsp

+0

Ah sì, sono corretto. Must of avuto un momento biondo :) – Jag

0

Questo codice permette all'utente di copiare il contenuto di una directory ad un'altra.

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

una semplice funzione che copia l'intero contenuto della cartella di origine nella cartella di destinazione e crea la cartella di destinazione, se non esiste

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))); 
     } 
    } 
} 
Problemi correlati