递归遍历目录树并列出文件名

Ste*_*Way 9 c# directory recursion

我正在尝试遍历整个目录树并打印出列表框控件上的所有文件名.我写了一些代码,但有错误.不知道我做错了什么.顺便说一句,这是在Visual Studio中使用WPF的C#中.

以下是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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

p.s*_*w.g 22

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


aba*_*hev 13

使用GetDirectories()重载接受SearchOption:

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

或更好的EnumerateFiles():

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

请注意,它执行惰性文件系统扫描.

  • 递归方法还有另一个优点.您可以在文件级别处理异常,而`SearchOption.AllDirectories`将抛出而无需继续下一个文件/目录(在记录之后). (4认同)