Sistema de archivos TreeView

Estoy trabajando con sistemas de archivos y tengo una lista de objetos de archivos que tienen la ruta del archivo como una propiedad. Básicamente, necesito crear una vista de árbol en .NET pero me cuesta pensar en la mejor manera de hacerlo ya que necesito crear una estructura de árbol a partir de una lista como:

C:/WINDOWS/Temp/ErrorLog.txt C:/Program Files/FileZilla/GPL.html C:/Documents and Settings/Administrator/ntuser.dat.LOG 

etc ….

La lista no está estructurada en absoluto y no puedo realizar ningún cambio en la estructura del objeto actual.

Estoy trabajando en C #.

Muchas gracias a todos los que contribuyen

Si quisieras seguir con las cuerdas, algo como esto funcionaría …

 TreeNode root = new TreeNode(); TreeNode node = root; treeView1.Nodes.Add(root); foreach (string filePath in myList) // myList is your list of paths { node = root; foreach (string pathBits in filePath.Split('/')) { node = AddNode(node, pathBits); } } private TreeNode AddNode(TreeNode node, string key) { if (node.Nodes.ContainsKey(key)) { return node.Nodes[key]; } else { return node.Nodes.Add(key, key); } } 

Convertiría la cadena en un FileInfo.

Una vez que tenga el objeto FileInfo , puede usar la propiedad Directory para recuperar el DirectoryInfo para cada ruta.

Una vez que tenga el DirectoryInfo para la ruta, es fácil “acercarse” a la referencia principal en DirectoryInfo para convertir cada ruta en una lista de directorios + nombre de archivo, es decir:

 {"C:","Windows","Temp","ErrorLog.txt"} 

Esto debería ser bastante sencillo de insertar en su vista de árbol. Solo busca cada sección del camino, y si no existe, agrégala ….

dale una oportunidad a la recursión.

 private void AddFiles() { // Iterate your list with FileInfos here foreach( var fileInfo in new Collection() ) { GetOrCreateTreeNode( fileInfo.Directory ).Nodes.Add( new TreeNode( fileInfo.Name ) ); } } private TreeNode GetOrCreateTreeNode( DirectoryInfo directory ) { if( directory.Parent == null ) { // Access your TreeView control here: var rootNode = .Nodes[directory.Name]; if( rootNode == null ) { rootNode = new TreeNode(directory.Name); // Access your TreeView control here: .Nodes.Add( rootNode ); } return rootNode; } var parent = GetOrCreateTreeNode( directory.Parent ); var node = parent.Nodes[directory.Name]; if( node == null ) { node = new DirectoryNode( directory ); parent.Nodes.Add( node ); } return node; } 

Este código debería darte solo una idea: tengo que admitir que no lo probé antes de publicarlo aquí.

  private void Form1_Load(object sender, EventArgs e) { var paths = new List { @"C:\WINDOWS\AppPatch\MUI\040C", @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727", @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MUI", @"C:\WINDOWS\addins", @"C:\WINDOWS\AppPatch", @"C:\WINDOWS\AppPatch\MUI", @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MUI\0409" }; treeView1.PathSeparator = @"\"; PopulateTreeView(treeView1, paths, '\\'); } private static void PopulateTreeView(TreeView treeView, IEnumerable paths, char pathSeparator) { TreeNode lastNode = null; string subPathAgg; foreach (string path in paths) { subPathAgg = string.Empty; foreach (string subPath in path.Split(pathSeparator)) { subPathAgg += subPath + pathSeparator; TreeNode[] nodes = treeView.Nodes.Find(subPathAgg, true); if (nodes.Length == 0) if (lastNode == null) lastNode = treeView.Nodes.Add(subPathAgg, subPath); else lastNode = lastNode.Nodes.Add(subPathAgg, subPath); else lastNode = nodes[0]; } } } 

texto alternativo

La pieza de EHosca funcionó perfectamente para mí, con un cambio: tuve que establecer el último nodo en nada después de la ruta foreach en el área de caminos.

Este es el código de eHosca anterior, portado a VB.

 Private Sub PopulateTreeView(tv As TreeView, paths As List(Of String), pathSeparator As Char) Dim lastnode As TreeNode = Nothing Dim subPathAgg As String For Each path In paths subPathAgg = String.Empty lastnode = Nothing For Each subPath In path.Split(pathSeparator) subPathAgg += subPath + pathSeparator Dim nodes() As TreeNode = tv.Nodes.Find(subPathAgg, True) If nodes.Length = 0 Then If IsNothing(lastnode) Then lastnode = tv.Nodes.Add(subPathAgg, subPath) Else lastnode = lastnode.Nodes.Add(subPathAgg, subPath) End If Else lastnode = nodes(0) End If Next Next End Sub