Hmm, saya pikir saya salah paham pertanyaannya tapi saya akan mengambil risiko. Apa yang salah dengan metode sederhana berikut ini?
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));
}
EDIT Karena posting ini telah mengumpulkan jumlah downvotes yang mengesankan untuk jawaban yang begitu sederhana untuk pertanyaan yang sama-sama sederhana, izinkan saya menambahkan penjelasan. Harap baca ini sebelum downvoting .
Pertama-tama, kode ini tidak dimaksudkan sebagai pengganti untuk kode yang ada dalam pertanyaan. Ini hanya untuk tujuan ilustrasi.
Microsoft.VisualBasic.Devices.Computer.FileSystem.CopyDirectory
melakukan beberapa tes ketepatan tambahan (misalnya apakah sumber dan target adalah direktori yang valid, apakah sumber tersebut adalah induk dari target, dll.) yang hilang dari jawaban ini. Kode itu mungkin juga lebih dioptimalkan.
Konon, kodenya berfungsi dengan baik . Ini telah (hampir identik) telah digunakan dalam perangkat lunak dewasa selama bertahun-tahun. Terlepas dari fickleness inheren yang hadir dengan semua penanganan IO (mis. Apa yang terjadi jika pengguna mencabut USB drive secara manual saat kode Anda menulisnya?), Tidak ada masalah yang diketahui.
Secara khusus, saya ingin menunjukkan bahwa penggunaan rekursi di sini sama sekali bukan masalah. Baik secara teori (secara konseptual, ini adalah solusi paling elegan) maupun dalam praktik: kode ini tidak akan meluap tumpukan . Tumpukannya cukup besar untuk menangani hierarki file yang bahkan sangat bersarang. Jauh sebelum ruang stack menjadi masalah, batasan panjang jalur folder akan muncul.
Perhatikan bahwa pengguna jahat mungkin dapat mematahkan asumsi ini dengan menggunakan direktori yang masing-masing bersarang dalam satu huruf. Saya belum mencoba ini. Tetapi hanya untuk mengilustrasikan intinya: untuk membuat kode ini meluap pada komputer biasa, direktori harus disarangkan beberapa ribu kali. Ini sama sekali bukan skenario yang realistis.