2013-03-15 4 views
8

Sto provando a percorrere un intero albero di directory e stampare tutti i nomi di file su un controllo listbox. Ho scritto del codice ma ci sono errori. Non sono sicuro di cosa sto sbagliando. A proposito, questo è in C# usando WPF in Visual Studio.Camminare ricorsivamente in un albero di directory e elencare i nomi di file

Ecco l'intera soluzione progetto in Visual Studio: http://tinyurl.com/a2r5jv9

Ecco il codice da MainWindow.xaml.cs se non si desidera scaricare la soluzione di progetto: http://pastebin.com/cWRTeq3N

I incollerà anche il codice qui.

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

Metodo all'interno di un altro metodo? – I4V

+0

Sembra che ci sia un errore di battitura nell'esempio di codice. –

+0

Quali sono gli errori esatti? –

risposta

18

C'è un complete example sul sito di supporto Microsoft

Il problema qui è che si desidera chiamataDirSearch dal gestore di eventi, ma sembra che si sta cercando di definire il metodo DirSearch all'interno del gestore eventi. Questo non è valido

è necessario modificare il codice come segue:

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

mentre siamo sull'argomento, come verificare la presenza di file duplicati ? ad esempio, se ci sono due file con lo stesso nome di file in due diverse directory, voglio produrre solo un nome di file. –

+0

@SteveWay usa 'if (lstFilesFound.Items.Contains (f)) {...}'. –

+0

sì, hai ragione di nuovo, amico mio. fatto funzionare! –

10

Uso GetDirectories() overload accepting SearchOption:

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

o meglio EnumerateFiles():

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

Avviso esegue pigro scansione filesystem.

+0

Questo è per un incarico presso la mia università. Il requisito è utilizzare un algoritmo ricorsivo. –

+3

L'approccio ricorsivo ha anche un altro vantaggio. È possibile gestire le eccezioni a livello di file mentre 'SearchOption.AllDirectories' getterà senza un'opzione per continuare con il file/directory successivo (dopo la registrazione). –

+0

Se è necessario essere desiderosi anziché pigri, si ha 'Directory.GetFiles' (il sovraccarico con SearchOption - per la ricorsione). Avevo bisogno di questo qualche anno fa, quando c'era un bug in Mono, dove i file venivano omessi quando si utilizza EnumerateFiles e restituiti in GetFiles. –