none
给一个指定的目录路径,将该路径映射的目录结构给树形对象,有什么比较快速且稳定的算法或方法?递归遍历大一点的目录效率太慢了。 RRS feed

  • 问题

  • 我采用递归遍历的方式将目录结构给treeView绑定的树形对象集合,然后用treeView显示数据,我运行后,尝试加载一个大约9G文件夹目录,它里面具体有多少目录,我不知道(我只目录下的遍历目录,不遍历文件)。加载时用计时器测试加载所需时间,结果如下。有点慢,

    我以为是数据量大的问题,将treeView开启虚拟化加载,再次运行测试后,结果还是如上图。后来我想是不是递归本身的问题?于是我把treeView的xaml代码给删了。只测试递归遍历的速度。测试一下。结果如下

    果然是算法问题啊。各位大神,将指定的目录路径映射的目录结构给树形对象,有什么比较快速且稳定的算法或方法?递归遍历容量大一点的目录效率太慢了。我看见一些wpf资源管理器的项目,加载整个硬盘的目录结构,几乎1秒钟不到就完成了,它是怎么做到的?难道有比递归更好的方法吗?我仅仅只是想加载一个指定路径映射的目录结构,只加载文件夹,非目录的都不加载,却这么慢。要如何解决呢?

    递归代码段,有什么可以优化的地方?或者其他的遍历方式?

    public void makeTree(object parameter) { TreeAddress.Clear(); TreeAddress.Add(makeTrees1()); } //递归生成树 public DirectoryTree makeTrees1() { DirectoryTree _myT = new DirectoryTree(); _myT.DirectoryName = "文件夹根目录"; _myT.DirectoryAddress = @"e:\game"; foreach (string directorys in Directory.GetDirectories(_myT.DirectoryAddress)) { DirectoryTree _myB = new DirectoryTree(); _myB.DirectoryName=Path.GetFileName(directorys); _myB.DirectoryAddress=directorys; _myT.CreateTreeWithChildre(_myB); makeTrees2(directorys, _myB); } return _myT; } public void makeTrees2(string directorys,DirectoryTree mytree) { foreach (string directoryss in Directory.GetDirectories(directorys)) { DirectoryTree _HD = new DirectoryTree(); _HD.DirectoryName= Path.GetFileName(directoryss); _HD.DirectoryAddress= directorys; mytree.CreateTreeWithChildre(_HD); makeTrees2(directoryss, _HD); } }


    实体类

    class DirectoryTree :  NotifyPropertyBase
        {
            public DirectoryTree Parent
            {
                get;
                set;
            }
            readonly ObservableCollection<DirectoryTree> _children = new ObservableCollection<DirectoryTree>();
            public ObservableCollection<DirectoryTree> SubDirectories
            {
    
                set;
                get;
            }
    
            public string DirectoryAddress { get; set; }
    
            public string DirectoryName { get; set; }
    
            public DirectoryTree() {
             
                this.SubDirectories = new ObservableCollection<DirectoryTree>();
            }
    
            public void CreateTreeWithChildre(DirectoryTree children)
            {
    
                this.SubDirectories.Add(children);
                children.Parent = this;
              
            }
    }


    2016年11月11日 1:11

答案

  • Hi 轮回的齿轮,

    递归算法是一个不错的算法。 我这边也测试了下(大约3千多个文件夹吧),时间1秒左右。 我们使用IO方式进行文件夹操作,据我所知IO效率快与磁盘的存取有关,如果IO设备支持并行存取,通过多线程可以加快速度。

    所以我建议你看看算法之类的,你可以尝试研究“单线程非递归的广度优先遍历算法”来实现。

    Best Regards,

    Yohann Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年11月11日 7:47
    版主