Файловая система TreeView

Im работает с файловыми системами, и у меня есть список файловых объектов, которые имеют путь к файлу как свойство. В основном мне нужно создать treeview в .NET, но я стараюсь думать о том, как это сделать, потому что мне нужно создать древовидную структуру из списка, например:

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

и т.д….

Список не структурирован вообще, и я не могу вносить какие-либо изменения в текущую структуру объекта.

Я работаю на C #.

Большое спасибо всем, кто вносит свой вклад

Если вы хотите придерживаться строк, что-то вроде этого будет работать …

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

Я бы превратил строку в FileInfo.

Когда у вас есть объект FileInfo , вы можете использовать свойство Directory для извлечения каталога для каждого пути.

Когда у вас есть каталог DirectoryInfo для этого пути, легко «подойти» к родительской ссылке в DirectoryInfo, чтобы превратить каждый путь в список каталогов + имя файла – то есть:

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

Это должно быть достаточно простым для вставки в ваше дерево. Просто найдите каждый раздел пути по очереди, и если он не существует, добавьте его ….

попробуйте рекурсию.

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

Этот код должен дать вам только идею – я должен признать, что я не тестировал ее перед публикацией здесь.

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

alt text

Часть EHosca работала для меня отлично, с одним изменением – я должен был установить lastnode в ничто после пути foreach в области путей.

Это код eHosca выше, портирован на 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 
  • Заполнение TreeView из базы данных
  • Древовидное мерцание?
  • Как сделать одиночный Связанный список на странице MVC View
  • WPF TreeView HierarchicalDataTemplate - привязка к объекту с несколькими дочерними коллекциями
  • TreeView Удалить CheckBox некоторыми узлами
  • заполнять дерево из списка путей файла в wpf
  • Давайте будем гением компьютера.