2009-03-24 3 views
14

мне нужно скопировать папку C: \ FromFolder в C: \ ToFolderКопирование папки в C# с использованием System.IO

Ниже код, который будет CUT мой FromFolder и затем создать свой ToFolder. Так что мой FromFolder пропадут и все детали будут в недавно созданную папку под названием ToFolder

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

Но я просто хочу, чтобы скопировать файлы в FromFolder в ToFolder. По какой-то причине нет System.IO.Directory.Copy ???

Как это делается с помощью пакетного файла - Очень легкий

хсору C: \ FromFolder C: \ ToFolder

С уважением Etienne

ответ

17

Эта ссылка обеспечивает хороший пример.

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

Вот фрагмент

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

есть копия файла. папки Recreate и скопировать все файлы из оригинального каталога на новый 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

Вам нужно создать новый каталог с нуля, то петли через все файлы в исходном каталоге и скопировать их.

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

я оставить создания каталога назначения для вас :-)

+0

Самое простое решение на сегодняшний день! Благодаря! – agleno

1

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

Из статьи:

К сожалению, там нет встроенной функции в System.IO, что скопирует папку и ее содержимое. Ниже приведен простой рекурсивный алгоритм, который копирует папку, ее подпапки и файлы, при необходимости создавая папку назначения. Для простоты нет обработки ошибок; исключение будет бросать, если что-то пойдет не так, например, пустые или недопустимые пути или если файлы назначения уже существуют.

Удачи вам!

2

Вы правы. Не существует метода Directory.Copy. Это был бы очень мощный метод, но также и опасный, для ничего не подозревающего разработчика. Копирование папки может быть очень трудоемкой, а перемещение одного (на одном диске) - нет.

Я полагаю, что Microsoft подумала, что будет делать копию файла по файлу, чтобы вы могли показать какую-то информацию о ходе. Вы можете перебирать файлы в каталоге, создавая экземпляр DirectoryInfo, а затем вызываете GetFiles(). Чтобы также включить подкаталоги, вы также можете вызвать GetDirectories() и перечислить их с помощью рекурсивного метода.

5

Копирование каталогов (правильно) на самом деле является довольно сложной задачей, особенно если принять во внимание передовой файловой системы методы, такие как соединения и жесткие ссылки. Лучше всего использовать API, который его поддерживает. Если вы не боитесь немного P/Invoke, SHFileOperation в shell32 - ваш лучший выбор. Другой альтернативой может быть использование метода Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory в сборке Microsoft.VisualBasic (даже если вы не используете VB).

0

Моя версия DirectoryInfo.CopyTo с использованием расширения.

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

И использовать, как ...

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

Как глубоко в структуру папок идет эта копия? Похоже, что он копирует только вложенные папки, а не вложенные подпапки. Похоже, что решение @RvdK является единственным, что является рекурсивным. – Jag

+0

Это рекурсивный @Jag, в последнем foreach DirectoryInfo, используемом для interate, в подкаталогах используется такое же расширение «CopyTo». ; P – diegodsp

+0

Ах да, я стою исправлено. Должен был иметь светловолосый момент :) – Jag

0

Этот код позволяет пользователю копировать содержимое одного каталога в другой.

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

Простая функция, которая копирует все содержимое исходной папки в папку назначения и создает папку, если она не существует

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))); 
     } 
    } 
} 
Смежные вопросы