2013-03-15 41 views
8

Tôi đang cố gắng đi qua toàn bộ cây thư mục và in ra tất cả tên tệp trên điều khiển hộp danh sách. Tôi đã viết một số mã nhưng có lỗi. Không chắc mình đang làm gì sai. Bằng cách này, đây là trong C# bằng cách sử dụng WPF trong Visual Studio.Đệ quy đi qua cây thư mục và liệt kê tên tệp

Dưới đây là giải pháp toàn bộ dự án trong Visual Studio: http://tinyurl.com/a2r5jv9

Đây là mã từ MainWindow.xaml.cs nếu bạn không muốn tải về giải pháp dự án: http://pastebin.com/cWRTeq3N

tôi sẽ dán mã ở đây.

public partial class MainWindow : Window 
{ 
    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     string sourcePath = @"C:\temp\";    

     static void DirSearch(string sourcePath) 
     { 
      try 
      { 
       foreach (string d in Directory.GetDirectories(sourcePath)) 
       { 
        foreach (string f in Directory.GetFiles(d)) 
        { 
         listBox1.Items.Add(f); 
        } 
        DirSearch(d); 
       } 
      }      
      catch (Exception ex) 
      { 
       listBox1.Items.Add(ex.Message); 
      } 
     } 
    } 
} 
+1

Phương pháp bên trong phương pháp khác? – I4V

+0

Dường như có lỗi đánh máy trong ví dụ mã của bạn. –

+0

Lỗi chính xác là gì? –

Trả lời

18

Có một complete example trên trang web hỗ trợ của Microsoft

Vấn đề ở đây là bạn muốn gọiDirSearch từ xử lý sự kiện, nhưng có vẻ bạn đang cố gắng xác định phương pháp DirSearch bên trong trình xử lý sự kiện. Điều này không hợp lệ.

Bạn cần thay đổi mã của bạn như sau:

private void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    string sourcePath = @"C:\temp\"; 
    this.DirSearch(sourcePath); 
} 

private void DirSearch(string sDir) 
{ 
    try 
    { 
     foreach (string f in Directory.GetFiles(sDir, txtFile.Text)) 
     { 
      lstFilesFound.Items.Add(f); 
     } 

     foreach (string d in Directory.GetDirectories(sDir)) 
     { 
      this.DirSearch(d); 
     } 
    } 
    catch (System.Exception excpt) 
    { 
     listBox1.Items.Add(ex.Message); 
    } 
} 
+0

khi chúng tôi đang ở trong chủ đề, cách kiểm tra tệp trùng lặp ? ví dụ, nếu có hai tệp có cùng tên tệp trong hai thư mục khác nhau, tôi muốn chỉ xuất một tên tệp. –

+0

@SteveWay sử dụng 'if (lstFilesFound.Items.Contains (f)) {...}'. –

+0

vâng, bạn lại đúng, bạn của tôi. làm cho nó hoạt động! –

10

Sử dụng GetDirectories() overload accepting SearchOption:

string[] dirs = Directory.GetDirectories(path, "*", SearchOption.AllDirectories)) 
foreach(dir) 
{ 
    ... 
} 

hoặc tốt hơn EnumerateFiles():

IEnumerable<string> files = Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories)) 
foreach(files) 
{ 
    ... 
} 

Thông báo nó thực hiện lười biếng hệ thống tập tin quét.

+0

Đây là một bài tập tại trường đại học của tôi. Yêu cầu là sử dụng thuật toán đệ quy. –

+3

Cách tiếp cận đệ quy cũng có một lợi thế khác. Bạn có thể xử lý các ngoại lệ ở cấp độ tệp trong khi 'SearchOption.AllDirectories' sẽ ném mà không có tùy chọn để tiếp tục với tệp/thư mục tiếp theo (sau khi ghi nhật ký). –

+0

Nếu bạn cần phải háo hức thay vì lười biếng, bạn có 'Directory.GetFiles' (quá tải với SearchOption - cho đệ quy). Tôi đã từng cần điều này một vài năm trước, khi có một lỗi trong Mono, nơi các tập tin bị bỏ qua khi sử dụng EnumerateFiles và trả về trong GetFiles. –

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