Как скопировать папку и все подпапки и файлы в .NET?

Возможный дубликат:
Лучший способ скопировать все содержимое каталога на C #

Я хотел бы скопировать папку со всеми вложенными папками и файлом из одного места в другое в .NET. Как лучше всего это сделать?

Я вижу метод Copy в классе System.IO.File, но мне было интересно, есть ли более простой, лучший или быстрый способ, чем сканирование дерева каталогов.


person dthrasher    schedule 30.06.2009    source источник
comment
xneuron .wordpress.com / 2007/04/12 / может быть вам полезен; он показывает простой рекурсивный метод   -  person Daniel LeCheminant    schedule 01.07.2009
comment
Я с нетерпением жду, когда мне понадобится выполнить какие-либо операции с файловой системой, потому что у меня есть законное оправдание для использования рекурсии!   -  person mmcdole    schedule 01.07.2009


Ответы (3)


Ну, есть реализация VisualBasic.dll, на которую ссылается Стив, и вот кое-что, что я использовал.

private static void CopyDirectory(string sourcePath, string destPath)
{
    if (!Directory.Exists(destPath))
    {
        Directory.CreateDirectory(destPath);
    }

    foreach (string file in Directory.GetFiles(sourcePath))
    {
        string dest = Path.Combine(destPath, Path.GetFileName(file));
        File.Copy(file, dest);
    }

    foreach (string folder in Directory.GetDirectories(sourcePath))
    {
        string dest = Path.Combine(destPath, Path.GetFileName(folder));
        CopyDirectory(folder, dest);
    }
}
person Michael Petrotta    schedule 01.07.2009

Михал Талага ссылается на следующее в своем сообщении:

  • Объяснение Microsoft о том, почему в .NET не должно быть операции Directory.Copy ().
  • Реализация CopyDirectory () из сборки Microsoft.VisualBasic.dll.

Однако рекурсивной реализации, основанной на File.Copy() и Directory.CreateDirectory(), должно хватить для самых основных потребностей.

person Steve Guidi    schedule 01.07.2009
comment
Интересная ссылка. Я не уверен, что аргументы Microsoft выдерживают критику. Но это объясняет, почему отсутствует эта функциональность. - person dthrasher; 01.07.2009

Если ничего лучше не получится ... может быть, использовать Process.Start, чтобы запустить robocopy.exe?

person Marc Gravell    schedule 30.06.2009
comment
Robocopy не анализирует кавычки должным образом при запуске с Process.Start, поэтому пути источника / назначения не должны содержать пробелов. Если это так, вы должны использовать имя файла 8dot3. Единственный раз, когда Robocopy правильно принимает кавычки, - это командная строка или BAT-файл. - person Brain2000; 02.12.2011
comment
@ Brain2000 вы всегда можете использовать короткие пути, если пробелы являются проблемой - person David Work; 30.03.2015