Хм, я думаю, что неправильно понимаю вопрос, но я собираюсь рискнуть им. Что случилось со следующим простым методом?
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));
}
РЕДАКТИРОВАНИЕ Начиная с этой регистрации собрало впечатляющее количество downvotes для такого простого ответа на одинаково простой вопрос, позвольте мне добавить объяснение. читает это перед downvoting.
, В первую очередь, этот код не является intendend как общедоступной заменой к коду в вопросе. Это для цели иллюстрации только.
Microsoft.VisualBasic.Devices.Computer.FileSystem.CopyDirectory
делает некоторые дополнительные тесты правильности (например, является ли источник и цель действительными каталогами, является ли источник родителем цели и т.д.), которые отсутствуют в этом ответе. Тот код, вероятно, также более оптимизирован.
Однако код работы хорошо . Это имеет (почти тождественно) используемый в зрелом программном обеспечении в течение многих лет. Кроме свойственной переменчивости дарят все обработки IO (например, что происходит, если пользователь вручную отключает Карту памяти, в то время как Ваш код пишет в него?), нет никаких известных проблем.
, В частности, I’d нравится указывать, что использование рекурсии здесь является абсолютно не проблемой. Ни один в теории (концептуально, it’s самое изящное решение), ни на практике: этот код не переполнит стека . Стек является достаточно большим для обработки даже глубоко вложенных файловых иерархий. Задолго до того, как стековое пространство становится проблемой, ограничение длины пути к папке умирает.
Уведомление, что злонамеренный пользователь мог бы быть в состоянии повредить это предположение при помощи глубоко вложенных каталогов одной буквы каждый. Я haven’t попробовал это. Но только проиллюстрировать тезис: чтобы заставить этот код переполниться на типичном компьютере, каталоги должны были бы быть вложены некоторые тысяча времена. Это - просто не реалистический сценарий.
Да. вы можете начать столько войн, сколько у вас есть системных ресурсов, таких как диск и память.