a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

遍歷文件系統目錄樹的深入理解

2020-01-24 03:15:07
字體:
來源:轉載
供稿:網友
在c#中可以遍歷指定驅動器或指定目錄下嵌套目錄中的所有文件或者任意深度的文件。通過遍歷可以檢索string形式的目錄名和文件名,也可以檢索 System.IO.FileInfo 或 System.IO.DirectoryInfo 對象形式的其他信息。可以通過遞歸遍歷堆棧遍歷兩種方式實現目錄遍歷。
遞歸遍歷
遞歸算法簡單,但嵌套樹太深,可能會引起堆棧溢出異常。
復制代碼 代碼如下:

/// <summary>
    /// 通過遞歸方式訪問目錄樹
    /// </summary>
    class RecursiveAccessDirectory
    {
        //聲明并實例化一個字符串集合
        static System.Collections.Specialized.StringCollection log
            = new System.Collections.Specialized.StringCollection();
        static void Main()
        {
            /*該部門代碼循環訪問本機所有驅動器上的文件
             *
             *
            //返回計算機邏輯驅動器名稱的字符串數組
            //包括光驅及連接計算機的移動驅動器
            string[] drives = System.Environment.GetLogicalDrives();
            foreach (string dr in drives)
            {
                System.IO.DriveInfo di = new System.IO.DriveInfo(dr);
                if (!di.IsReady)
                {
                    Console.WriteLine("驅動器 {0} 不能讀出", di.Name);
                    continue;
                }
                System.IO.DirectoryInfo rootDir = di.RootDirectory;
                WalkDirectoryTree(rootDir);
            }
           */
            /*循環訪問指定目錄下的文件夾
             *
             */
            System.IO.DirectoryInfo rootDir = new System.IO.DirectoryInfo(@"C:/test");
            WalkDirectoryTree(rootDir);
            Console.WriteLine("限制用戶訪問文件:");
            foreach (string s in log)
            {
                Console.WriteLine(s);
            }
            Console.Read();
        }

      
        static void WalkDirectoryTree(System.IO.DirectoryInfo root)
        {
            System.IO.FileInfo[] files = null;
            System.IO.DirectoryInfo[] subDirs = null;
            try
            {
                //GetFiles方法的參數可以包含通配符。
                //即使目錄下沒有匹配的文件,返回長度為0不為空的數組對象,
                //所以遞歸函數可以放在if (files != null)里。
                //下面為查找所有有后綴名的文件。
                files = root.GetFiles("*.*");
            }
            //請求權限超過應用程序提供權限拋出異常
            catch (System.UnauthorizedAccessException e)
            {
                //在訪問某個文件夾遭受拒絕時,
                //您可以提升自己的權限,然后再次訪問它。
                log.Add(e.Message);
            }
            catch (System.IO.DirectoryNotFoundException e)
            {
                Console.WriteLine(e.Message);
            }

            if (files != null)
            {
                foreach (System.IO.FileInfo fi in files)
                {
                    Console.WriteLine("{0}: {1} {2}", fi.FullName, fi.Length, fi.CreationTime);
                }
                subDirs = root.GetDirectories();
                foreach (System.IO.DirectoryInfo dirInfo in subDirs)
                {
                    WalkDirectoryTree(dirInfo);
                }
            }
        }
    }

堆棧遍歷
利用泛型 Stack<T> 集合類型實現,該類型是一個后進先出 (LIFO) 堆棧。
復制代碼 代碼如下:

/// <summary>
    /// 通過堆棧方式訪問目錄樹
    /// </summary>
    class StackAccessDirectory
    {

        static void Main()
        {
            TraverseTree(@"C:/test");
            Console.Read();
        }

        public static void TraverseTree(string root)
        {
            Stack<string> dirs = new Stack<string>(20);
            if (!System.IO.Directory.Exists(root))
            {
                throw new ArgumentException();
            }
            dirs.Push(root);
            while (dirs.Count > 0)
            {
                string currDir = dirs.Pop();
                string[] subDirs;
                try
                {
                    subDirs = System.IO.Directory.GetDirectories(currDir);
                }
                catch (System.UnauthorizedAccessException e)
                {
                    Console.WriteLine(e.Message);
                    continue;
                }
                catch (System.IO.DirectoryNotFoundException e)
                {
                    Console.WriteLine(e.Message);
                    continue;
                }
                string[] files=null;
                try
                {
                    files=System.IO.Directory.GetFiles(currDir);
                }
                catch(System.UnauthorizedAccessException e)
                {
                    Console.WriteLine(e.Message);
                    continue;
                }
                catch(System.IO.DirectoryNotFoundException e)
                {
                    Console.WriteLine(e.Message);
                    continue;
                }
                foreach (string file in files)
                {
                    try
                    {
                        System.IO.FileInfo fi = new System.IO.FileInfo(file);
                        Console.WriteLine("{0}: {1} {2}", fi.Name, fi.Length, fi.CreationTime);
                    }
                    catch (System.IO.FileNotFoundException e)
                    {
                        Console.WriteLine(e.Message);
                        continue;
                    }
                }
                foreach (string str in subDirs)
                    dirs.Push(str);
            }
        }
    }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 在线看片日韩 | 日韩在线观看视频一区二区 | 久久首页 | 午夜激情综合 | 黄色网免费看 | 国产www | 日韩精品一区二区三区老鸭窝 | bxbx成人精品一区二区三区 | 麻豆高清免费国产一区 | 欧美一二 | 国产高清视频一区二区 | 亚洲精品影院 | 免费黄色在线 | 久久精品一 | 成人欧美一区二区三区在线播放 | 成人av免费 | www.久久久.com | 成人精品一区 | 亚洲 欧美 在线 一区 | 国内精品一区二区 | 国产精品自产拍在线观看桃花 | 国产精品不卡 | 国产一区二区三区在线免费 | 日本三级国产 | 日本中文在线观看 | 日韩精品免费观看 | 精品国产污污免费网站入口 | 亚洲黄色成人网 | a视频在线观看 | a视频在线观看免费 | 精品一二三区在线观看 | 亚洲精品成人免费 | 天天色天天色 | 天天插天天射天天干 | 国产精品国色综合久久 | 一区二区三区的视频 | 国产精品久久久久久久久福交 | 欧美精品h| 欧美色呦呦| 蜜桃日韩 | 看一级毛片视频 |