Hmm, tôi nghĩ rằng tôi hiểu sai câu hỏi nhưng tôi sẽ mạo hiểm nó. Có gì sai với phương pháp đơn giản sau đây?
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 Vì bài đăng này đã thu được số lượng downvote ấn tượng cho một câu trả lời đơn giản như vậy cho một câu hỏi đơn giản không kém, hãy để tôi thêm một lời giải thích. Xin vui lòng đọc này trước khi downvote .
Trước hết, mã này không có ý định thay thế cho mã trong câu hỏi. Nó chỉ nhằm mục đích minh họa.
Microsoft.VisualBasic.Devices.Computer.FileSystem.CopyDirectory
thực hiện một số kiểm tra tính chính xác bổ sung (ví dụ: nguồn và đích có phải là thư mục hợp lệ hay không, nguồn có phải là cha mẹ của mục tiêu không, v.v.) bị thiếu trong câu trả lời này. Mã đó có lẽ cũng được tối ưu hóa hơn.
Điều đó nói rằng, mã hoạt động tốt . Nó đã (gần như giống hệt) được sử dụng trong một phần mềm trưởng thành trong nhiều năm. Ngoài sự hay thay đổi vốn có với tất cả các tay cầm IO (ví dụ: điều gì xảy ra nếu người dùng rút ổ USB theo cách thủ công trong khi mã của bạn đang ghi vào nó?), Không có vấn đề nào được biết đến.
Cụ thể, tôi muốn chỉ ra rằng việc sử dụng đệ quy ở đây hoàn toàn không phải là vấn đề. Về mặt lý thuyết (về mặt khái niệm, đó là giải pháp tao nhã nhất) cũng như trong thực tế: mã này sẽ không tràn vào ngăn xếp . Ngăn xếp đủ lớn để xử lý các phân cấp tệp được lồng sâu. Lâu trước khi không gian ngăn xếp trở thành một vấn đề, giới hạn độ dài đường dẫn thư mục sẽ khởi động.
Lưu ý rằng một người dùng độc hại có thể phá vỡ giả định này bằng cách sử dụng các thư mục được lồng sâu của mỗi chữ cái. Tôi đã không thử điều này. Nhưng chỉ để minh họa điểm: để làm cho mã này tràn vào một máy tính thông thường, các thư mục sẽ phải được lồng vào nhau vài nghìn lần. Đây đơn giản không phải là một kịch bản thực tế.