Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: Duyệt thư mục không đệ quy trong lập trình C#?

  1. #1
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Question Duyệt thư mục không đệ quy trong lập trình C#?

    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.

  2. #2
    Ngày gia nhập
    05 2007
    Bài viết
    55

    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:
    1. System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(“C:\\Program files”);
    2. 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.

  3. #3
    Ngày gia nhập
    01 2007
    Bài viết
    412

    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?

  4. #4
    Ngày gia nhập
    05 2007
    Bài viết
    55

    Đặ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:
    Visual C# Code:
    1. System.IO.DirectoryInfo sourceDir = new System.IO.DirectoryInfo(@"D:\Setup\Microsoft\OS\XP Pro Sp2 Setup");
    2. 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:
    Visual C# Code:
    1. 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
    Visual C# Code:
    1. System.IO.Directory.CreateDirectory(sourceFiles[index].Directory);
    sau đó copy file:
    Visual C# Code:
    1. 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

  5. #5
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    Đặ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á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

  6. #6
    Ngày gia nhập
    02 2008
    Bài viết
    88

    Mặc định Duyệt thư mục không đệ quy trong lập trình C#?

    Đọ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.

  7. #7
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    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.

  8. #8
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    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:

    Code:
    C:\
    C:\fol1\
    C:\fol1\child1\
    C:\fol1\child2\
    ...
    C:\fol2
    Chiều rộng thì dùng Queue

    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:
    1. void XuLy( string path)
    2. {
    3.       ...........
    4. }
    5.  
    6. void DuyetThuMuc( string path, IVector vector)
    7. {
    8.      string childPath;
    9.      - Lay danh sach cac thu muc cap 1 cua path
    10.      - Duyet danh sach
    11.      for (...)
    12.      {
    13.            childPath= childFolder[i];
    14.            vector.push ( childPath)
    15.            Xuly (childPath)
    16.      }
    17.  
    18.      // Duyet cac thu muc cap N
    19.      while ( vector.size() != 0)
    20.      {          
    21.            path = vector.pop();
    22.            - Lay danh sach cac thu muc cap 1 cua path
    23.            -  Duyet danh sach do
    24.            for (...)
    25.            {
    26.                  childPath= childFolder[i];
    27.                  vector.push ( childPath)
    28.                  Xuly (childPath)
    29.            }
    30.      }
    31. }

    XStack và XQueue mình đồng nhất lại bằng IVector.

    Visual C# Code:
    1. using System.Collections.Generic;
    2.  
    3. interface IVector
    4. {
    5.       void push(Object p);
    6.       Object pop()
    7.       int size();
    8. }
    9.  
    10. class XQueue: Queue, IVector
    11. {
    12.       public void push (Object p)
    13.       {
    14.            this.Enqueue(p);
    15.       }
    16.      
    17.       public object pop()
    18.       {
    19.            return this.Dequeue();
    20.       }
    21.  
    22.       public int size()
    23.       {
    24.            return this.Count;
    25.       }
    26. }
    27.  
    28. class XStack: Stack, IVector
    29. {
    30.       public void push (Object p)
    31.       {
    32.            this.Push(p);
    33.       }
    34.      
    35.       public object pop()
    36.       {
    37.            return this.Pop();
    38.       }
    39.  
    40.       public int size()
    41.       {
    42.            return this.Count;
    43.       }
    44. }

    Vậy duyệt theo chiều sâu:
    Code:
    DuyetThuMuc( "C:\", new XStack() );
    Duyệt theo chiều rộng
    Code:
    DuyetThuMuc( "C:\", new XQueue() );

  9. #9
    Ngày gia nhập
    07 2007
    Nơi ở
    TP.HCM
    Bài viết
    199

    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:
    1.         private void WalkDirectories(string sPath, string subFolder, ref List<m_File> fileList)
    2.         {
    3.             m_File tFile = new m_File();
    4.             if (subFolder == "YES")
    5.             {
    6.                 int index = 0;
    7.                 List<string> dirList = new List<string>();
    8.                 dirList.Add(sPath);
    9.  
    10.                 while (index < dirList.Count)
    11.                 {
    12.                     foreach (string dir in Directory.GetDirectories(dirList[index]))
    13.                     {
    14.                         if ((File.GetAttributes(dir) & FileAttributes.System) != 0 && !chSystem.Checked) continue;
    15.                         dirList.Add(dir);
    16.                     }
    17.                     foreach (FileInfo file in new DirectoryInfo(dirList[index]).GetFiles())
    18.                     {
    19.                         Application.DoEvents();
    20.                     }
    21.                     index++;
    22.                 }
    23.             }
    24.             else if (subFolder == "NO")
    25.             {
    26.                 foreach (FileInfo file in new DirectoryInfo(sPath).GetFiles())
    27.                 {
    28.                     Application.DoEvents();
    29.                 }
    30.             }
    31.        }

  10. #10
    Ngày gia nhập
    05 2007
    Bài viết
    55

    Mặc định Có 1 người YM cho mình nhờ giải quyết tiếp topic này

    Visual C# Code:
    1. private static bool CopyDirectory(string SourcePath, string DestinationPath, bool overwriteexisting)  
    2. {  
    3.    bool ret = false;  
    4.    try  
    5.    {  
    6.        SourcePath = SourcePath.EndsWith(@"\") ? SourcePath : SourcePath + @"\";  
    7.        DestinationPath = DestinationPath.EndsWith(@"\") ? DestinationPath : DestinationPath + @"\";  
    8.  
    9.        if (Directory.Exists(SourcePath))  
    10.        {  
    11.            if (Directory.Exists(DestinationPath) == false)  
    12.                Directory.CreateDirectory(DestinationPath);  
    13.  
    14.            foreach (string fls in Directory.GetFiles(SourcePath))  
    15.            {  
    16.                FileInfo flinfo = new FileInfo(fls);  
    17.                flinfo.CopyTo(DestinationPath + flinfo.Name, overwriteexisting);  
    18.            }  
    19.            foreach (string drs in Directory.GetDirectories(SourcePath))  
    20.            {  
    21.                DirectoryInfo drinfo = new DirectoryInfo(drs);  
    22.                if (CopyDirectory(drs, DestinationPath + drinfo.Name, overwriteexisting) == false)  
    23.                    ret = false;  
    24.            }  
    25.        }  
    26.        ret = true;  
    27.    }  
    28.    catch (Exception ex)  
    29.    {  
    30.        ret = false;  
    31.    }  
    32.    return ret;  
    33. }
    source: _http://blog.logiclabz.com/c/copy-directory-in-net-c-including-sub-folders.aspx
    have fun @@

Các đề tài tương tự

  1. Trình duyệt Opera, giúp bạn trải nghiệm tốt hơn khi duyệt wap
    Gửi bởi hailuacuibep trong diễn đàn Software (Phần mềm) | Ebooks
    Trả lời: 2
    Bài viết cuối: 02-01-2013, 12:12 PM
  2. Lỗi con trỏ DSLK, add vào nhưng khi duyệt con trỏ vẫn bằng NULL, ko duyệt được
    Gửi bởi kuhoang0512 trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 9
    Bài viết cuối: 29-11-2011, 04:20 PM
  3. Duyệt các controls bằng foreach thì control nào sẽ được duyệt trước
    Gửi bởi chitviv trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 05-10-2011, 10:01 PM
  4. Cách thức duyệt tiền tự trên cây khi duyệt từ con trái nhất rồi sang anh em ruột phải?
    Gửi bởi tyrant trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 0
    Bài viết cuối: 14-09-2011, 10:53 AM
  5. ADO.NET Thứ tự của control( textbox) được duyệt khi chạy đệ quy duyệt các control trên form
    Gửi bởi caheoxanh trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 17-06-2011, 09:12 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn