2016-02-08 7 views
0

У меня есть функция GetDirectories(), который возвращает мне список информации каталога: Теперь мне нужно восстановить древовидный из него, на основе своего родителяReconstruct Древовидное из списка <DirectoryInfo>

Вот моя функция Getdirectories которой возвращает List:

public List<DirectoryInfo> GetDirectories() 
    { 
     DirectoryInfo di = new DirectoryInfo("D:\\python_code"); 
     folders.Clear(); 
     FullDirList(di, "*"); 
     return folders; 
    } 
static List<DirectoryInfo> folders = new List<DirectoryInfo>(); // List that hold direcotries that cannot be accessed 
static void GetFullDirList(DirectoryInfo dir, string searchPattern) 
    { 
     try 
     { 
      foreach (FileInfo f in dir.GetFiles(searchPattern)) 
      { 
       files.Add(f); 
      } 
     } 
     catch 
     { 
     } 

     foreach (DirectoryInfo d in dir.GetDirectories()) 
     { 
      folders.Add(d); 
      FullDirList(d, searchPattern); 
     } 

    } 

мне нужно что-то вроде этого, чтобы быть построен из списка, который содержит все элементы DirectoryInfo т.е. содержит родительскую информацию также.

Tree View of List<DirectoryInfo>

до сих пор я пытаюсь получить элементы, родитель однотипны и заселить его просмотра в виде дерева и сделать это рекурсивно: Но я не в состоянии получить рекурсивную функцию написанную через.

Я знаю их другие более простые способы сделать то же самое, но это набор большой картины, которую я пытаюсь нарисовать. всякая помощь была бы предельно аппроксимирована.

ответ

1

Предполагая, что у вас есть дерево WinForms, вы можете использовать ключевой аргумент метода Find в коллекции Nodes для создания вашей иерархии. Для этого вам не нужна рекурсия. Вот метод Add:

void Add(DirectoryInfo di) 
    { 
     if (di.Parent != null) 
     { 
      // find our parent node 
      var node = treeView1.Nodes.Find(di.Parent.FullName,true); 
      if (node.Length == 0) 
      { 
       // not found, add it as root 
       // FullName becomes the key 
       treeView1.Nodes.Add(di.FullName, di.Name); 
      } 
      else 
      { 
       // not sure what is going on if node.Length > 1 
       // anyway, add it to the first node, to be our parent 
       node[0].Nodes.Add(di.FullName, di.Name); 
      } 
     } 
     else 
     { 
      treeView1.Nodes.Add(di.FullName, di.Name); 
     } 
    } 

И простой итератор будет вести этот метод:

 var list = GetDirectories(); 
     foreach(var di in list) 
     { 
      Add(di); 
     } 
+0

Спасибо за ответы. , +1 для чистого и простого способа, но мне нужно добавить узел дерева вместо простой строки, который будет иметь каждый узел как каталогinfo, так что мне не нужно делать поиск его родителем. делая это var node = treeView1.Nodes.Find (di.Parent.FullName, true); не работает для меня – csharpcoder

+0

Вы должны иметь возможность установить 'FullPath' вашего treeNode в di.FullName и с этим я ожидаю, что его можно найти. – rene

+0

Я благодарю еще раз. , я получил его работу – csharpcoder