Файловая система TreeView - PullRequest
8 голосов
/ 23 марта 2009

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

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

и т.д ....

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

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

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

Ответы [ 5 ]

16 голосов
/ 23 марта 2009

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

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);
    }
}
4 голосов
/ 23 марта 2009

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

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

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

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

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

2 голосов
/ 20 ноября 2009
    private void Form1_Load(object sender, EventArgs e)
    {
        var paths = new List<string>
                        {
                            @"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<string> 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

2 голосов
/ 23 марта 2009

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

private void AddFiles()
{
  // Iterate your list with FileInfos here
  foreach( var fileInfo in new Collection<FileInfo>() )
  {
    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 = <TreeView>.Nodes[directory.Name];
    if( rootNode == null )
    {
      rootNode = new TreeNode(directory.Name);
      // Access your TreeView control here:
      <TreeView>.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;
}

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

0 голосов
/ 19 апреля 2011

Часть 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
...