Hmm, sanırım soruyu yanlış anlıyorum ama riske atacağım. Aşağıdaki basit yöntemde sorun nedir?
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));
}
DÜZENLEME Bu gönderi, aynı derecede basit bir soruya bu kadar basit bir cevap için etkileyici sayıda aşağı oy aldığından, bir açıklama eklememe izin verin. Lütfen indirmeden önce bunu okuyun .
Her şeyden önce, bu kod söz konusu kodun yerine bir değiştirme olarak tasarlanmamıştır. Sadece örnekleme amaçlıdır.
Microsoft.VisualBasic.Devices.Computer.FileSystem.CopyDirectory
bu yanıtta bulunmayan bazı ek doğruluk testleri (örneğin, kaynak ve hedefin geçerli dizin olup olmadığı, kaynağın hedefin bir üst öğesi olup olmadığı vb.) yapar. Bu kod muhtemelen daha da optimize edilmiştir.
Bununla birlikte, kod iyi çalışıyor . O etmiştir (hemen hemen aynı) yıl süreyle olgun bir yazılım kullanılmıştır. Tüm IO işlemcilerinde bulunan doğal yapışkanlığın dışında (örneğin, kodunuz yazarken kullanıcı USB sürücüsünü manuel olarak çıkarırsa ne olur?), Bilinen bir sorun yoktur.
Özellikle, burada özyineleme kullanımının kesinlikle bir sorun olmadığını belirtmek isterim. Ne teoride (kavramsal olarak, en zarif çözüm) ne de pratikte: bu kod yığının üzerine taşmaz . Yığın, derin yuvalanmış dosya hiyerarşilerini bile işleyebilecek kadar büyüktür. Yığın alanı sorun haline gelmeden çok önce, klasör yolu uzunluğu sınırlaması devreye girer.
Kötü niyetli bir kullanıcının , her biri bir harflik derin iç içe dizinler kullanarak bu varsayımı kırabileceğine dikkat edin . Bunu denemedim. Ancak sadece konuyu açıklamak için: Bu kodun tipik bir bilgisayarda taşmasını sağlamak için dizinlerin birkaç bin kez iç içe yerleştirilmesi gerekir . Bu sadece gerçekçi bir senaryo değil.