Копирование папок в C # с использованием System.IO - PullRequest
14 голосов
/ 24 марта 2009

Мне нужно скопировать папку C: \ FromFolder в C: \ ToFolder

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

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

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

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

xcopy C: \ FromFolder C: \ ToFolder

С уважением Etienne

Ответы [ 10 ]

18 голосов
/ 24 марта 2009

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

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));
        }
    }
17 голосов
/ 24 марта 2009

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

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);
  }
}
5 голосов
/ 24 марта 2009

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

4 голосов
/ 24 марта 2009

да, вы правы.

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

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

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

2 голосов
/ 31 января 2017

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

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)));
        }
    }
}
2 голосов
/ 24 марта 2009

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

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

2 голосов
/ 24 марта 2009

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

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

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

1 голос
/ 24 марта 2009

В этой статье представлен журнал для рекурсивного копирования некоторой папки и всего ее содержимого

Из статьи:

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

Удачи!

0 голосов
/ 23 мая 2016

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

using System;
using System.IO;

// ...
    static void Main(string[] 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(string source, string 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));
    }
0 голосов
/ 10 мая 2013

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

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"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...