C# 有效树列表

C# 有效树列表,c#,tree,filesystems,explorer,C#,Tree,Filesystems,Explorer,我正在尝试使用树列表中的递归节点函数创建Windows资源管理器。我想知道是否有办法只加载已单击的信息-例如,我可以使用 foreach (DriveInfo drive in DriveInfo.GetDrives()) 给我类似的东西 C:// D:// E:// 如果我从每个驱动器加载所有内容,它会很快变大。因此,我想知道是否有一个好的方法来初始化驱动器,一旦它被放大,它将只填充被点击的驱动器 C:// 折叠1 折叠2 折页3 文件1 等等 D:// E:// 我想我只是

我正在尝试使用树列表中的递归节点函数创建Windows资源管理器。我想知道是否有办法只加载已单击的信息-例如,我可以使用

foreach (DriveInfo drive in DriveInfo.GetDrives())
给我类似的东西

  • C://

  • D://

  • E://

如果我从每个驱动器加载所有内容,它会很快变大。因此,我想知道是否有一个好的方法来初始化驱动器,一旦它被放大,它将只填充被点击的驱动器

  • C://
    • 折叠1
    • 折叠2
    • 折页3
      • 文件1
      • 等等
  • D://

  • E://

我想我只是想知道这是否可能,或者我是否应该不担心性能,从一开始就填充整个树

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace CST238___Justin_OBrien___Assign_3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void folderTree_AfterSelect(object sender, TreeViewEventArgs e)
        {
            populateTree(folderTree, somePath); //help here please =D
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            currDirPath.Text = "current directory";
            foreach (DriveInfo drive in DriveInfo.GetDrives())
            {
                folderTree.Nodes.Add(new TreeNode(drive.Name)); //initialize
            }
        }

        private void populateTree(TreeView tree, string path)
        {
            tree.Nodes.Clear();
            var path1 = new DirectoryInfo( path );
            tree.Nodes.Add(dirNode( path1 ));
        }

        private static TreeNode dirNode(DirectoryInfo di)
        {
            var dNode = new TreeNode(di.Name);
            foreach( var subfolder in di.GetDirectories())
            {
                dNode.Nodes.Add(dirNode( subfolder ));
            }

            foreach( var file in di.GetFiles() )
            {
                dNode.Nodes.Add(new TreeNode(file.Name));
            }

            return dNode;
        }
    }
}

这就是我到目前为止所做的,我决定使用前面提到的foreach默认只使用主驱动器,并根据函数中单击操作的路径递归单击的内容来处理递归。但我得到的结果不一致。我可能根本没有显示任何内容,或者列出了驱动器,但它们没有响应任何单击操作,我知道我做错了什么,但不确定是什么。

欢迎使用堆栈溢出。请尽快阅读这一页。我强烈建议您在问题中添加至少一个标记,用于您计划使用的宿主语言。是C、C++、C、F、java、Ruby、Perl、Python、VB、……答案是,您肯定不希望同时加载所有内容。如果其中任何一个驱动器是网络驱动器,它将给您带来令人震惊的性能,如果您的任何一个驱动器在100G或更大的范围内(通常在台式机或服务器上),它也会占用大量内存。你绝对应该按照要求而不是预先建立这个列表。感谢我编辑的建议,将C#作为我使用的语言,并发布了我自提出这个问题以来一直在做的工作。这应该会让能帮助你的人看到它。我知道C#的存在,但就我所知。而且,发布您尝试过的内容通常也是改进问题的一个重要步骤。离MCVE()越近,人们就越容易帮助你。有人吗/辩护律师