Хм, я думаю, что неправильно понял вопрос, но я собираюсь рискнуть. Что не так со следующим простым методом?
public static void CopyFilesRecursively(DirectoryInfo source, DirectoryInfo target) {
foreach (DirectoryInfo dir in source.GetDirectories())
CopyFilesRecursively(dir, target.CreateSubdirectory(dir.Name));
foreach (FileInfo file in source.GetFiles())
file.CopyTo(Path.Combine(target.FullName, file.Name));
}
РЕДАКТИРОВАТЬ Так как эта публикация собрала впечатляющее количество голосов за такой простой ответ на столь же простой вопрос, позвольте мне добавить объяснение. Пожалуйста, прочитайте это до понижения .
Прежде всего, этот код не предназначен для замены кода, о котором идет речь. Это только для иллюстрации.
Microsoft.VisualBasic.Devices.Computer.FileSystem.CopyDirectory
выполняет некоторые дополнительные тесты на корректность (например, являются ли источник и цель действительными каталогами, является ли источник родителем цели и т. д.), которые отсутствуют в этом ответе. Этот код, вероятно, также более оптимизирован.
Тем не менее, код работает хорошо . Он имеет (почти одинаково) был использован в зрелом программном обеспечении в течение многих лет. Помимо врожденной неустойчивости, присутствующей во всех обработках ввода-вывода (например, что произойдет, если пользователь вручную отключит USB-накопитель во время записи на него кода?), Нет известных проблем.
В частности, я хотел бы отметить, что использование рекурсии здесь абсолютно не проблема. Ни в теории (концептуально, это самое элегантное решение), ни на практике: этот код не будет переполнять стек . Стек достаточно большой, чтобы обрабатывать даже глубоко вложенные файловые иерархии. Задолго до того, как место в стеке станет проблемой, начинает действовать ограничение длины пути к папке.
Обратите внимание, что злонамеренный пользователь может нарушить это предположение, используя глубоко вложенные каталоги по одной букве в каждой. Я не пробовал это. Но просто чтобы проиллюстрировать это: для того, чтобы код переполнялся на типичном компьютере, каталоги должны быть вложены несколько тысяч раз. Это просто нереальный сценарий.