2011-07-07 33 views
14

đây là mã của tôi:Tôi có thể thực hiện quét thư mục và tệp đệ quy đầy đủ như thế nào?

private static void TreeScan(string sDir) 
    { 
     foreach (string d in Directory.GetDirectories(sDir)) 
     { 
      foreach (string f in Directory.GetFiles(d)) 
      { 
       //Save file f 
      } 
     } 
     TreeScan(d, client); 
    } 

Vấn đề là nó không có được FILES của sDir(Bắt đầu Directory) nó chỉ nhận được thư mục và tập tin trong thư mục Sub .

Tôi làm cách nào để lấy tệp từ sDir?

Trả lời

8
private static void TreeScan(string sDir) 
{ 
    foreach (string f in Directory.GetFiles(sDir)) 
    { 
     //Save f :) 
    } 
    foreach (string d in Directory.GetDirectories(sDir)) 
    { 
     TreeScan(d); 
    } 
} 
1

Bạn phải sử dụng

Directory.GetFiles(targetDirectory); 

như trong This sample, mà chứa một thực hiện hoàn chỉnh các bạn đang tìm kiếm

44

gì Đừng phát minh lại bánh xe, sử dụng sự quá tải của GetFiles cho phép bạn chỉ định rằng nó tìm kiếm thư mục con.

string[] files 
    = Directory.GetFiles(path, searchPattern, SearchOption.AllDirectories); 
+2

Cuối cùng, người nào đó có ý nghĩa nào đó. –

+1

Có nhưng đệ quy thất bại lần đầu tiên được bảo vệ bằng thư mục System.UnauthorizedAccessException. – MuiBienCarlota

+0

nếu bạn không yêu cầu mẫu tìm kiếm, bạn có thể sử dụng dấu sao (*) cho mẫu tìm kiếm để trả về tất cả các thư mục –

2

Có một số vấn đề với mã của bạn. Đối với một, lý do bạn không bao giờ nhìn thấy các tập tin từ thư mục gốc là bởi vì bạn recursed trước khi làm và đọc tập tin. Hãy thử điều này:

public static void Main() 
{ 
    TreeScan(@"C:\someFolder"); 
} 

private static void TreeScan(string sDir) 
{ 
    foreach (string f in Directory.GetFiles(sDir)) 
     Console.WriteLine("File: " + f); // or some other file processing 

    foreach (string d in Directory.GetDirectories(sDir)) 
     TreeScan(d); // recursive call to get files of directory 
} 
0

Vòng lặp GetFiles của bạn phải nằm ngoài vòng GetDirectories. Và TreeScan của bạn có nên ở lại bên trong vòng GetDirectories không? Nói tóm lại mã sẽ giống như thế này:

private static void TreeScan(string sDir) 
{ 
    foreach (string d in Directory.GetDirectories(sDir)) 
    { 
     TreeScan(d, client); 
    } 
    foreach (string f in Directory.GetFiles(d)) 
    { 
     //Save file f 
    } 
} 
0

Nếu sử dụng Fx4 và trên phương pháp EnumerateFiles sẽ trở lại tất cả các file với quản lý bộ nhớ hiệu quả, trong khi GetFiles có thể đòi hỏi nguồn lực tối đa trên các thư mục lớn (hoặc ổ đĩa).

var files = Directory.EnumerateFiles(dir.Path, "*.*"); 
Các vấn đề liên quan