2013-03-15 5 views
8

Я пытаюсь пройти через полное дерево каталогов и распечатать все имена файлов в элементе управления списком. Я написал код, но есть ошибки. Не уверен, что я делаю неправильно. Кстати, это в C#, используя WPF в Visual Studio.Рекурсивно ходить по дереву каталогов и перечислять имена файлов

Здесь весь проект решения в Visual Studio: http://tinyurl.com/a2r5jv9

Вот код из MainWindow.xaml.cs, если вы не хотите, чтобы загрузить проектное решение: http://pastebin.com/cWRTeq3N

Я вклеить код здесь также.

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

Метод внутри другого метода? – I4V

+0

В вашем примере кода, похоже, есть опечатка. –

+0

Каковы точные ошибки? –

ответ

18

Существует complete example на сайте поддержки Microsoft

Проблема здесь в том, что вы хотите вызовDirSearch из обработчика события, но, похоже, вы пытаетесь определить метод DirSearch внутри обработчика события. Это неверно.

Вы должны изменить код следующим образом:

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

пока мы на тему, как проверить дубликаты файлов ? например, если в двух разных каталогах есть два файла с одинаковым именем файла, я хочу вывести только одно имя файла. –

+0

@SteveWay использовать 'if (lstFilesFound.Items.Contains (f)) {...}'. –

+0

да, ты снова прав, мой друг. заставил его работать! –

10

Использование GetDirectories() overload accepting SearchOption:

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

или лучше EnumerateFiles():

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

Обратите внимание, он выполняет ленивым файловой системы сканирования.

+0

Это для задания в моем университете. Требование - использовать рекурсивный алгоритм. –

+3

Рекурсивный подход имеет еще одно преимущество. Вы можете обрабатывать исключения на уровне файла, тогда как 'SearchOption.AllDirectories' будет бросать без возможности продолжить работу со следующим файлом/каталогом (после ведения журнала). –

+0

Если вам нужно быть нетерпеливым, а не ленивым, у вас есть 'Directory.GetFiles' (перегрузка с SearchOption - для рекурсии). Мне это понадобилось несколько лет назад, когда в Mono произошла ошибка, где файлы были опущены при использовании EnumerateFiles и возвращены в GetFiles. –

Смежные вопросы