2013-03-15 9 views
8

Próbuję przejść przez całe drzewo katalogów i wydrukować wszystkie nazwy plików w kontrolce listbox. Napisałem trochę kodu, ale są błędy. Nie jestem pewien, co robię źle. Przy okazji, jest to w C# przy użyciu WPF w Visual Studio.Rekursywnie przechodzenie przez drzewo katalogów i wyświetlanie nazw plików

Oto całe rozwiązanie projekt w Visual Studio: http://tinyurl.com/a2r5jv9

Oto kod z MainWindow.xaml.cs jeśli nie chcesz, aby pobrać roztwór projektu: http://pastebin.com/cWRTeq3N

będę wkleić tutaj również kod.

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

Metoda wewnątrz innej metody? – I4V

+0

Wygląda na literówkę w twoim przykładzie kodu. –

+0

Jakie są dokładne błędy? –

Odpowiedz

18

Jest complete example na stronie pomocy technicznej firmy Microsoft

Problem jest to, że chcesz rozmowyDirSearch z obsługi zdarzenia, ale wydaje się, że próbujesz określić metoda DirSearch wewnątrz obsługi zdarzenia. To nie jest poprawne.

Musisz zmienić swój kod w następujący sposób:

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

gdy jesteśmy na temat, jak sprawdzić duplikaty plików ? na przykład, jeśli istnieją dwa pliki o tej samej nazwie pliku w dwóch różnych katalogach, chcę wypisać tylko jedną nazwę pliku. –

+0

@SteveWay użyj 'if (lstFilesFound.Items.Contains (f)) {...}'. –

+0

Tak, masz rację, mój przyjacielu. zmusił go do działania! –

10

Zastosowanie GetDirectories() overload accepting SearchOption:

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

lub lepiej EnumerateFiles():

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

Wskazówka wykonuje leniwe skanowanie plików.

+0

To jest zadanie na moją uczelnię. Wymagane jest użycie algorytmu rekursywnego. –

+3

Podejście rekursywne ma również inną zaletę. Możesz obsłużyć wyjątki na poziomie pliku, podczas gdy 'SearchOption.AllDirectories' wyrzuci bez opcji kontynuowania następnego pliku/katalogu (po zalogowaniu). –

+0

Jeśli chcesz być chętny zamiast leniwego, masz 'Directory.GetFiles' (przeciążenie z SearchOption - dla rekursji). Kiedyś potrzebowałem tego kilka lat temu, kiedy wystąpił błąd w Mono, gdzie pliki zostały pominięte podczas używania EnumerateFiles i zwrócone w GetFiles. –

Powiązane problemy