Как сделать рекурсивный поиск по всем файлам
Здрасте. Нужна помощь в поиске ошибки в коде по поиску всех файлов на жестких дисках или папках, используя 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);
}
}
Результат
