如何执行递归目录搜索

本文关键字:递归 搜索 执行 何执行 | 更新日期: 2023-09-27 18:13:06

我试图线程下面的函数,以便背景形式可以继续移动,不会"冻结",有人可以帮助我这样做吗?

    public IEnumerable<string> GetFiles(string path) 
    {
        Queue<string> queue = new Queue<string>();
        queue.Enqueue(path);
        while (queue.Count > 0)
        {
            path = queue.Dequeue();
            try
            {
                foreach (string subDir in Directory.GetDirectories(path))
                {
                    queue.Enqueue(subDir);
                }
            }
            catch (Exception ex)
            {
                richTextBox1.AppendText(ex.Message);
            }
            string[] files = null;
            try
            {
                files = Directory.GetFiles(path);
            }
            catch (Exception ex)
            {
                richTextBox1.AppendText(ex.Message);
            }
            if (files != null)
            {
                for (int i = 0; i < files.Length; i++)
                {
                    yield return files[i];
                }
            }
        }
    }

我用下面的按钮执行代码:

 private void button1_Click(object sender, EventArgs e)
    {
        int count = 0;
        FolderBrowserDialog dialog = new FolderBrowserDialog();
        dialog.ShowDialog();
        string selected = dialog.SelectedPath;
        foreach (string file in GetFiles(selected))
        {
            count++;
            richTextBox1.AppendText(file + Environment.NewLine);
        }
        label2.Text = count.ToString();
    }

如何执行递归目录搜索

把整个事情放到一个后台线程中(可能是BackgroundWorker,可能是。net 4中的Task),当你想要更新UI时,使用Control.InvokeControl.BeginInvoke封送回UI线程。

你将不能仅仅调用GetFiles并在UI中使用结果-至少在c# 5之前,这将使所有这一切变得更容易async/await -但是你可以让后台线程"告诉"UI线程何时完成-以及何时找到每个单独的文件。基本上,放弃迭代器块,或者将count保持为类中的状态,或者让后台线程在完成后回调UI线程时报告总数。