Как сделать рекурсивный поиск по всем файлам

Здрасте. Нужна помощь в поиске ошибки в коде по поиску всех файлов на жестких дисках или папках, используя TreeView в WinForms. Код такой:

private void FillDIsks(TreeNode node, string path)//node - родительский узел
    {
        try
        {
            string[] folders = Directory.GetDirectories(path);
            foreach (string folder in folders)//пробегаюсь по всем папках в папке
            {
                TreeNode tree = new TreeNode(folder);// новый узел с названием папки
                treeView1.Invoke(new Action(() => node.Nodes.Add(tree)));// добавляем узел к родителькому
                string[] files = Directory.GetFiles(path);//получаем все файлы в папке
                foreach (var file in files)//пробегаюсь по всем файлам в папке
                {
                    TreeNode treeNode = new TreeNode(Path.GetFileName(file));// новый узел с названием файла
                    treeView1.Invoke(new Action(() => node.Nodes.Add(treeNode)));//добавляем узел к родителькому
                }
                FillDIsks(tree, folder);//запускаем цикл заново
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

Для оптимизации использую BackgroundWorker, в нем запускаю этот метод. Проблема в том, что если убрать цикл по поиску файлов в папках, то метод находит все папки правильно и строит дерево хорошо, а в полной версии метода (включая папки в поиске), он строит дерево неправильно, он засовывает файлы не в дочернюю папку, а в родительскую и если в стартовой папке есть какой-то файл, то он добавляет 2 узла вместо одного с названием этого файла


Ответы (1 шт):

Автор решения: tym32167

Примерно так будет выглядеть форма с рекурсивным поиском файлов и папок

public class F1: Form
{
    public F1()
    {
        var tv = new TreeView() {Dock = DockStyle.Fill};
        this.Controls.Add(tv);
        this.Load += async (sender, args) => 
        {
            var rootPath = @"D:\temp\SO";
            var root = new TreeNode(rootPath);
            await Fill(root, rootPath);
            tv.Nodes.Add(root);
        };
    }
    
    public async Task Fill(TreeNode node, string path){
        var directories = await Task.Run(()=>Directory.GetDirectories(path));
        
        foreach(var d in directories)
        {
            var dnode = new TreeNode(d);
            await Fill(dnode, d);
            node.Nodes.Add(dnode);
        }       
        
        var files = await Task.Run(()=>Directory.GetFiles(path));       
        foreach(var fnode in files.Select(f=>new TreeNode(f)))
            node.Nodes.Add(fnode);
    }
}

Результат

...

→ Ссылка