2013-05-17 38 views
5

Tôi đang cố gắng liệt kê tất cả các tệp trong một thư mục đã cho bằng cách lấy thư mục con cũng như vào tài khoản. Tôi đang sử dụng lợi nhuận để tôi có thể câu lạc bộ bằng Take (lưu ý rằng tôi đang sử dụng .NET 3.5).Tìm tất cả các tệp trong một thư mục bằng cách liệt kê

Dưới đây là mã của tôi:

IEnumerable<string> Search(string sDir) 
{ 
     foreach (var file in Directory.GetFiles(sDir)) 
     { 
      yield return file;     
     } 

     foreach (var directory in Directory.GetDirectories(sDir)) 
     { 
       Search(directory);     
     } 
} 

Tôi không biết những gì đang xảy ra sai ở đây, nhưng nó chỉ trả về một tập tin (đó là ai dưới thư mục gốc, và chỉ có ai ở đó như tốt). Bạn có thể giúp đỡ không?

+12

Không phát minh lại bánh xe. Sử dụng 'Directory.EnumerateFiles' và' Directory.EnumerateDirectories'. – Oded

+0

Ồ, và bạn không phải là 'trả về lợi nhuận' cho' Tìm kiếm (thư mục) ', mà có lẽ là một trong những vấn đề ở đây. – Oded

+0

Cảm ơn Oded..will Directory.EnumerateFiles và Directory.EnumerateDirectories hoạt động trong .NEt 3.5? – Mike

Trả lời

12

Bạn cần phải đạt được kết quả của việc tìm kiếm đệ quy, nếu không bạn chỉ cần ném quả của nó đi:

IEnumerable<string> Search(string sDir) 
{ 
    foreach (var file in Directory.GetFiles(sDir)) 
    { 
     yield return file;     
    } 

    foreach (var directory in Directory.GetDirectories(sDir)) 
    { 
     foreach(var file in Search(directory)) 
      yield return file; 
    } 
} 

Lưu ý rằng nếu bạn ý định là chỉ cần có được một danh sách phẳng của mỗi tập tin, hãy xem xét sử dụng Directory.GetFiles thay thế bằng tùy chọn tìm kiếm tất cả các thư mục phụ. Nếu mục đích của bạn là tận dụng LINQ (hoặc các phương pháp khác) để áp dụng tiêu chí tìm kiếm hoặc giới hạn tổng số tệp được truy xuất, thì đây là một cách phù hợp để bạn đọc từng thư mục và dừng lại khi bạn ' đã hoàn thành tiêu chí của bạn.

+5

Sẽ không [Directory.GetFiles (String, String, SearchOption)] (http://msdn.microsoft.com/en-us/library/ms143316.aspx) thích hợp hơn? –

+0

Mã hóa với đỉnh cao của công nghệ. – lsalamon

+0

Ở một số khía cạnh, việc viết phiên bản của riêng bạn là tiện lợi ngay cả trên .Net 4 hoặc mới hơn - vì phiên bản .Net 4 không có cách xử lý ngoại lệ dễ dàng do các thư mục hệ thống không thể truy cập được. Ít nhất là nếu bạn tự sở hữu, bạn có thể thêm xử lý thích hợp. Tuy nhiên, Net 3.5 * có * có 'Directory.GetFiles (chuỗi, chuỗi, SearchOption)' như John H nói! Nhưng tôi thích điều này tốt hơn. –

Các vấn đề liên quan