2011-06-04 24 views
24

soy nuevo con nodos aquí .. :) me ocurrió con este algoritmo, sino que sólo muestra la lista de nodos padre .. como esta ..Rellenar TreeView con estructura de directorios del sistema de archivos

a 
    a.txt 
    b 
    c 
c 
    m 
    n 
b 
    o 
    p 
etc... 

quiero el siguiente nodo será puesto en uno de los nodos dentro del nodo anterior .. por lo que se van a plantear como esto ..

a 
    a.txt 
    b 
     o 
     p 
    c 
     m 
     n 
etc... 

tengo algunas ideas en mente, pero me puede aplicar a los códigos. . :) cualquier ayuda por favor ..

private void ListDirectory(TreeView treeView, String path) 
{    
    Stack<string> stack = new Stack<string>(); 
    TreeNode DirFilesCollection = new TreeNode(); 

    stack.Push(path);    

    while (stack.Count > 0) 
    { 
     string dir = stack.Pop(); 
     try 
     { 
      List<String> parentDir = new List<string>(); 
      parentDir.AddRange(Directory.GetFiles(dir, "*.*")); 
      parentDir.AddRange(Directory.GetDirectories(dir)); 

      DirectoryInfo d = new DirectoryInfo(dir); 
      TreeNode TParent = new TreeNode(d.Name); 

      foreach (String s in parentDir) 
      { 
       FileInfo f = new FileInfo(s); 
       TreeNode subItems = new TreeNode(f.Name); 

       TParent.Nodes.Add(subItems); 
      } 

      DirFilesCollection.Nodes.Add(TParent); 

      foreach (string dn in Directory.GetDirectories(dir)) 
      { 
       stack.Push(dn); 
      } 
     } 
     catch 
     {} 
    } 

    Action clearTreeView =() => treeView.Nodes.Clear(); 
    this.Invoke(clearTreeView); 

    Action showTreeView =() => treeView.Nodes.Add(DirFilesCollection); 
    this.Invoke(showTreeView); 
} 

Respuesta

92

Opción # 1: enfoque recursivo:

private void ListDirectory(TreeView treeView, string path) 
{ 
    treeView.Nodes.Clear(); 
    var rootDirectoryInfo = new DirectoryInfo(path); 
    treeView.Nodes.Add(CreateDirectoryNode(rootDirectoryInfo)); 
} 

private static TreeNode CreateDirectoryNode(DirectoryInfo directoryInfo) 
{ 
    var directoryNode = new TreeNode(directoryInfo.Name); 
    foreach (var directory in directoryInfo.GetDirectories()) 
     directoryNode.Nodes.Add(CreateDirectoryNode(directory)); 
    foreach (var file in directoryInfo.GetFiles()) 
     directoryNode.Nodes.Add(new TreeNode(file.Name)); 
    return directoryNode; 
} 

Opción # 2: Enfoque no recursiva:

private static void ListDirectory(TreeView treeView, string path) 
{ 
    treeView.Nodes.Clear(); 

    var stack = new Stack<TreeNode>(); 
    var rootDirectory = new DirectoryInfo(path); 
    var node = new TreeNode(rootDirectory.Name) { Tag = rootDirectory }; 
    stack.Push(node); 

    while (stack.Count > 0) 
    { 
     var currentNode = stack.Pop(); 
     var directoryInfo = (DirectoryInfo)currentNode.Tag; 
     foreach (var directory in directoryInfo.GetDirectories()) 
     { 
      var childDirectoryNode = new TreeNode(directory.Name) { Tag = directory }; 
      currentNode.Nodes.Add(childDirectoryNode); 
      stack.Push(childDirectoryNode); 
     } 
     foreach (var file in directoryInfo.GetFiles()) 
      currentNode.Nodes.Add(new TreeNode(file.Name)); 
    } 

    treeView.Nodes.Add(node); 
} 
+4

@vrynxzent - si está interesado, la respuesta actualizada con un enfoque no recursivo también. –

+0

ahh ... ya veo ... prefiero usar el no recursivo debido al subprocesamiento y probar capturar ... también puedo hacerlo en método recursivo pero necesito ver el formulario que actualiza los datos mientras obtengo archivos y directorios ... –

+0

Usé funciones recursivas e iterativas y este es mi código, pero el complemento arroja un error: ** Se deniega el acceso a la ruta 'E: \ System Volume Information \'. **; este es mi código: ** ListDirectory (treeView1, @ "E: \"); ** –

Cuestiones relacionadas