duyệt thư mục, duyệt file .net đã hỗ trợ sẵn. Chỉ việc viết theo ý tưởng thôi.
Visual C# Code:
System.IO.DirectoryInfo[] dirs = dir.GetDirectories("*", System.IO.SearchOption.AllDirectories);
Dựa vào topic hướng dẫn dùng đệ quy để duyệt thư mục của pete: Duyệt đệ quy các files và thư mục trong lập trình C#
Theo như mình biết, với thủ tục đệ quy, nếu folder có ít sub-folder thì không có chi đáng bàn, nhưng nếu như số sub-folder nhiều thì việc này sẽ ngốn tài nguyên hệ thống lắm.
Vậy bạn nào có cách duyệt thư mục không dùng đệ quy không? Mình có tham khảo trên mạng, nghe nói là ứng dụng lý thuyết đồ thị để làm điều này, hình như áp dụng BFS.
duyệt thư mục, duyệt file .net đã hỗ trợ sẵn. Chỉ việc viết theo ý tưởng thôi.
Visual C# Code:
System.IO.DirectoryInfo[] dirs = dir.GetDirectories("*", System.IO.SearchOption.AllDirectories);
Đã được chỉnh sửa lần cuối bởi nampt : 29-06-2007 lúc 08:53 AM.
Cái này em biết, anh thử viết cho em phương thức sao chép thư mục nguồn sang thư mục đích (files và sub-folder) mà không dùng đệ quy được không anh?
Đặt vấn đề:
Thuật toán copy folder và tất cả những gì có trong folder đó trên .net (giống như các OS thường làm) mà chúng ta không sử dụng truy hồi (đệ quy).
Giả sử chúng ta cần copy folder: "D:\Setup\Microsoft\OS\XP Pro Sp2 Setup" vào folder: "C:\Setup\Save". Như vậy sau khi copy ta sẽ đc: "D:\Setup\Save\XP Pro Sp2 Setup"
Giải quyết vấn đề:
Khai báo:
Lấy tên tất cả các file có trong sourceDir bằng phương thức:Visual C# Code:
Tạo 1 đối tượng destFiles có số phần tử bằng số phần tử của sourceFiles và xác định FullName của các destFiles[index] (chú ý những gì viết sau đây có [index] thì thuật toán sẽ sử dụng vòng for) bằng cách so sánh tương quan vị trí tương đối của sourceDir, destDir một cách tổng quát để đi đến kết luận thêm bớt đường dẫn cho phù hợp. Khi đã xác định đc FullName của nó ta sẽ tiến hành gán nó bằng cách:Visual C# Code:
System.IO.FileInfo[] sourceFiles = sourceDir.GetFiles("*", System.IO.SearchOption.AllDirectories);
Tiến hành copy file và folder: Nếu destFiles[index].Directory chưa tồn tại thì khởi tạo nó bằng phương thứcCode:destFiles[index] = new System.IO.FileInfo("Đường dẫn phù hợp");
sau đó copy file:Visual C# Code:
System.IO.Directory.CreateDirectory(sourceFiles[index].Directory);
Visual C# Code:
sourceFiles[index].CopyTo(destFiles[index].FullName);
Đến đây coi như xong nhưng chú ý CopyTo có đối thứ 2 kiểu bool là overwrite và chúng ta hoàn toàn có thể cho phép người dùng lựa chọn trong quá trình copy nếu gặp.
Bài này a viết ở nhà, cho vào usb, gửi qua my mail, paste vào CDCV.
Khi viết xong 12h đêm không kịp kiểm tra lại. Nếu có gì khó hiểu hoặc kỳ quặc thì thắc mắc để a chỉnh lý tiếp
cái dòng đỏ anh nói khó hiêu thế,em muốn hỏi là nếu khôn đệ quy thì anh làm thế nào mà lần ra các ngõ ngách của folder thế,có thể cho em code trên VC++ khôngĐặt vấn đề:
Thuật toán copy folder và tất cả những gì có trong folder đó trên .net (giống như các OS thường làm) mà chúng ta không sử dụng truy hồi (đệ quy).
Giả sử chúng ta cần copy folder: "D:\Setup\Microsoft\OS\XP Pro Sp2 Setup" vào folder: "C:\Setup\Save". Như vậy sau khi copy ta sẽ đc: "D:\Setup\Save\XP Pro Sp2 Setup"
Giải quyết vấn đề:
Khai báo:
Code:
System.IO.DirectoryInfo sourceDir = new System.IO.DirectoryInfo
(@"D:\Setup\Microsoft\OS\XP Pro Sp2 Setup");
System.IO.DirectoryInfo destDir = new System.IO.DirectoryInfo
(@"D:\Setup\Save\XP Pro Sp2 Setup");
Lấy tên tất cả các file có trong sourceDir bằng phương thức:
Code:
System.IO.FileInfo[] sourceFiles = sourceDir.GetFiles(
"*", System.IO.SearchOption.AllDirectories);
Tạo 1 đối tượng destFiles có số phần tử bằng số phần tử của sourceFiles và xác định FullName của các destFiles[index] (chú ý những gì viết sau đây có [index] thì thuật toán sẽ sử dụng vòng for) bằng cách so sánh tương quan vị trí tương đối của sourceDir, destDir một cách tổng quát để đi đến kết luận thêm bớt đường dẫn cho phù hợp. Khi đã xác định đc FullName của nó ta sẽ tiến hành gán nó bằng cách:
Code:
destFiles[index] = new System.IO.FileInfo("Đường dẫn phù hợp");
Tiến hành copy file và folder: Nếu destFiles[index].Directory chưa tồn tại thì khởi tạo nó bằng phương thức
Code:
System.IO.Directory.CreateDirectory(sourceFiles[index].Directory);
sau đó copy file:
Code:
sourceFiles[index].CopyTo(destFiles[index].FullName);
Đến đây coi như xong nhưng chú ý CopyTo có đối thứ 2 kiểu bool là overwrite và chúng ta hoàn toàn có thể cho phép người dùng lựa chọn trong quá trình copy nếu gặp.
Đọc đoạn code trên thì thấy rằng nó chỉ copy được các file và thư mục ở cấp 1.
Các cấp 2,3,4 thì ko làm được, vẫn phải dùng đệ quy để gọi thi hành lại.
Mình từ Caulacbovb qua)
Giã từ VB6 đến với VB.Net, C# và Java.![]()
Mình nghĩ đệ quy vẫn là tốt nhất. Nếu bạn sợ hết stack thì dùng phương pháp cấp phát động cho stack, khoảng 1 đến 2 mb là đã dư lắm rồi.
Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.
Khử đệ quy thì bạn có thể dùng Stack hay Queue.
- Nếu quét theo chiều sâu thì dùng Stack:
Chiều rộng thì dùng QueueCode:C:\ C:\fol1\ C:\fol1\child1\ C:\fol1\child2\ ... C:\fol2
Code:C:\fol1\ C:\fol2\ ... C:\foln\ C:\fol1\child1 C:\fol1\child2 ... C:\fol1\childn ....
Mình code thuật toán thôi:
Visual C# Code:
{ ........... } { string childPath; - Lay danh sach cac thu muc cap 1 cua path - Duyet danh sach { childPath= childFolder[i]; vector.push ( childPath) Xuly (childPath) } // Duyet cac thu muc cap N { path = vector.pop(); - Lay danh sach cac thu muc cap 1 cua path - Duyet danh sach do { childPath= childFolder[i]; vector.push ( childPath) Xuly (childPath) } } }
XStack và XQueue mình đồng nhất lại bằng IVector.
Visual C# Code:
Vậy duyệt theo chiều sâu:
Duyệt theo chiều rộngCode:DuyetThuMuc( "C:\", new XStack() );
Code:DuyetThuMuc( "C:\", new XQueue() );
ZCoder87 nói rất dúng, phải dùng queue để duyệt theo chiều rộng, cái này là vấn dề cơ bản khi học cấu trúc dữ liệu, Đây là một minh họa cụ thể của queue.
Visual C# Code:
{ { dirList.Add(sPath); { { dirList.Add(dir); } { Application.DoEvents(); } index++; } } { { Application.DoEvents(); } } }
source: _http://blog.logiclabz.com/c/copy-directory-in-net-c-including-sub-folders.aspxVisual C# Code:
{ { SourcePath = SourcePath.EndsWith(@"\") ? SourcePath : SourcePath + @"\"; DestinationPath = DestinationPath.EndsWith(@"\") ? DestinationPath : DestinationPath + @"\"; { Directory.CreateDirectory(DestinationPath); { flinfo.CopyTo(DestinationPath + flinfo.Name, overwriteexisting); } { } } } { } return ret; }
have fun @@