首页 新闻 会员 周边 捐助

C# 如何快速遍历文件夹

1
悬赏园豆:5 [已解决问题] 解决于 2018-04-18 09:12

目前试了三种方法

1.递归

2.广度优先

3.Directory.GetFiles(path, "*", SearchOption.AllDirectories) 方法

但是试起来貌似最快的仍然是递归,有什么更好的方法么?

代码如下:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;

namespace ConsoleApp4
{
    class Program
    {
        static void Main(string[] args)
        {
            var path = @"E:\GIT";
            //递归遍历文件夹
            Stopwatch sw = new Stopwatch();

            //遍历所有文件夹和文件
            sw.Reset();
            sw.Start();
            all(path);
            sw.Stop();
            Console.WriteLine("耗时:{0}", sw.ElapsedMilliseconds);

            sw.Start();
            ListFiles(new DirectoryInfo(path), "-");
            sw.Stop();
            Console.WriteLine("耗时:{0}", sw.ElapsedMilliseconds);
            
            //广度优先遍历文件夹
            sw.Reset();
            sw.Start();
            Traversing(path);
            sw.Stop();
            Console.WriteLine("耗时:{0}", sw.ElapsedMilliseconds);

            Console.ReadKey();
        }
        /// <summary>
        /// 递归遍历文件夹
        /// </summary>
        /// <param name="info"></param>
        /// <param name="dep"></param>
        public static void ListFiles(FileSystemInfo info,string dep)
        {
            if (!info.Exists)
                return;
            DirectoryInfo dir = info as DirectoryInfo;
            if (dir == null)
                return;
            FileSystemInfo[] files = dir.GetDirectories();
            foreach (var file in files)
            {
                if (file != null)
                { 
                    //Console.WriteLine("{0}{1}", dep, file.Name);         
                    //dep = dep + "-";
                    ListFiles(file, dep);
                }
            }
        }
        /// <summary>
        /// 广度优先算法遍历文件夹
        /// </summary>
        /// <param name="sPathName"></param>
        public static void Traversing(string sPathName)
        {
            //创建一个队列保存子目录
            Queue<string> pathQueue = new Queue<string>();
            //首先将根目录排入队列中
            pathQueue.Enqueue(sPathName);
            //开始循环查找文件,知道队列中无任何子目录
            while (pathQueue.Count > 0)
            {
                //从队列中取出一个目录,把该目录下的所有目录排入队列中
                DirectoryInfo dirParent = new DirectoryInfo(pathQueue.Dequeue());
                foreach (var diChild in dirParent.GetDirectories())
                {
                    pathQueue.Enqueue(diChild.FullName);
                    foreach (var fi in dirParent.GetFiles())
                    {
                       // Console.WriteLine(fi.Name);
                    }
                }
            }
        }

        public static void all(string path)
        {
            var x = 0;
            //获取所有文件
            foreach (string f in Directory.GetFiles(path, "*", SearchOption.AllDirectories))
            {
                //Console.WriteLine(f);
                x++;
            }
            //获取所有文件夹,只遍历文件的话似乎跟上面两个算法少了一步,所以又遍历了所有文件夹
            foreach (string f in Directory.GetDirectories(path, "*", SearchOption.AllDirectories))
            {
                //Console.WriteLine(f);
                x++;
            }

        }
    }
}
GYY_顽石的主页 GYY_顽石 | 初学一级 | 园豆:143
提问于:2017-12-26 16:37
< >
分享
最佳答案
1

我是来收藏代码的MAKE

收获园豆:5
87Super | 初学一级 |园豆:107 | 2017-12-26 17:20

0.0

GYY_顽石 | 园豆:143 (初学一级) | 2017-12-26 17:21
其他回答(2)
0

我觉得,你这里的广度优先和递归没啥区别。你试出来的快慢的区别主要在于你创建对象的数量多少。。。。

哈哈5377 | 园豆:224 (菜鸟二级) | 2018-04-18 10:57
0

+1,我是来收藏代码的MAKE

CharyGao | 园豆:240 (菜鸟二级) | 2023-11-03 20:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册