using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace FileClass
{
    class Program
    {
        static System.Collections.Specialized.StringCollection log = new System.Collections.Specialized.StringCollection();
        static void Main(string[] args)
        {
            //获取逻辑分区
            string[] drives = System.Environment.GetLogicalDrives();
            foreach (string d in drives)
            {
                System.IO.DriveInfo di=new System.IO.DriveInfo(d);
               
                //排除
                if (!di.IsReady)
                {
                    Console.WriteLine("drive is not ready:{0}",di);
                    continue;
                }
              
                    Console.WriteLine("drive is ready:{0}", di);
                    DirectoryInfo dirRoot = di.RootDirectory;
                    WalkDirectoryTree(dirRoot);


               
            }
            Console.WriteLine("exception:");
            foreach (string s in log)
            {
                Console.WriteLine(s);
                StreamWriter writer = new StreamWriter(@"C:\Users\PSY\Desktop\list.txt", true, Encoding.Default);
                writer.WriteLine(s);
                writer.Close();
            }
            Console.ReadKey();
        }

        ///
        /// 遍历文件夹
        ///
        ///
        public static void WalkDirectoryTree(System.IO.DirectoryInfo root)
        {
            System.IO.FileInfo[] files = null;
            System.IO.DirectoryInfo[] subDirs = null;
            try
            {
                files = root.GetFiles("*.*");
            }
            catch (UnauthorizedAccessException e)
            {
                log.Add(e.Message);
                
            }
            catch(DirectoryNotFoundException e)

            {
                Console.WriteLine(e.Message);
            }
            if (files != null)
            {
                foreach (FileInfo fi in files)
                {
                    Console.WriteLine(fi.FullName);
                    StreamWriter writer = new StreamWriter(@"C:\Users\PSY\Desktop\list.txt",true,Encoding.Default);

                    writer.WriteLine(fi.FullName);
                    writer.Close();
                }
                //递归调用
                subDirs = root.GetDirectories();
                foreach (DirectoryInfo dirInfo in subDirs)
                {
                    WalkDirectoryTree(dirInfo);
                }
            }

        }
    }
}

关键笔记:
1、获取本机逻辑分区:
string[] drives = System.Environment.GetLogicalDrives();

2、获取所有文件:(DirectoryInfo dir)
FileInfo[] fileInfo = dir.GetFiles();

3、获取所有目录:(DirectoryInfo dir)
 DirectoryInfo[] directoryInfo = dir.GetDirectories();

参考链接:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/file-system/how-to-iterate-through-a-directory-tree