Sistema de arquivos TreeView

Estou trabalhando com filesystems e tenho uma lista de objetos de arquivo que têm o caminho do arquivo como uma propriedade. Basicamente eu preciso criar um treeview no .NET, mas estou lutando para pensar na melhor maneira de fazer isso, pois eu preciso criar uma estrutura de árvore a partir de uma lista como:

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

etc ….

A lista não está estruturada e não posso fazer alterações na estrutura atual do object.

Eu estou trabalhando em c #.

Muito obrigado por todos que contribuem

Se você quisesse ficar com as cordas, algo assim funcionaria …

 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); } } 

Eu transformaria a string em um FileInfo.

Depois de ter o object FileInfo , você pode usar a propriedade Directory para recuperar o DirectoryInfo para cada caminho.

Uma vez que você tenha o DirectoryInfo para o caminho, é fácil “subir” a referência Parent no DirectoryInfo para transformar cada caminho em uma lista de diretórios + nome de arquivo – ie:

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

Isso deve ser bastante simples de inserir no seu treeview. Basta olhar para cada seção do caminho, por sua vez, e se não existir, adicione-o ….

tente recursion.

 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; } 

Esse código deve lhe dar apenas uma ideia – tenho que admitir que não testei antes de postar aqui.

  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

O trabalho de EHosca funcionou perfeitamente para mim, com uma mudança – eu tive que definir lastnode para nada depois do caminho foreach na área de caminhos.

Este é o código do eHosca acima, portado para o 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