9

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

这是 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);
            }
        }
    }
}
4

2 回答 2

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);
    }
}
于 2013-03-15T23:43:50.937 回答
16

使用GetDirectories() 重载接受 SearchOption

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

或更好的 EnumerateFiles()

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

注意它执行惰性文件系统扫描。

于 2013-03-15T23:45:18.623 回答