C#WinForm Directory文件夹目录+递归

一、知识点概述

1、Directory是静态类,隶属于System.IO命名空间,专门用来操作【文件夹/目录】,所有方法均为静态方法,无需实例化对象;File类专门操作文件,二者分工明确。

2、该类支持文件夹创建、删除、查询子文件、查询子文件夹、同时获取文件和目录等全套操作。

3、本案例额外拓展两个递归案例:递归实现斐波那契数列、递归深度遍历多层级文件夹,递归核心逻辑为方法内部调用自身,设置终止条件防止死循环。

二、完整源代码

复制代码
using System;
using System.IO;
using System.Windows.Forms;

namespace _10文件目录
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            #region 1.文件夹基础操作
            //创建目录
            // Directory.CreateDirectory(@"C:\Users\Administrator\Desktop\FirstDay");

            //获取指定文件夹内所有文件(仅文件)
            //string[] paths =  Directory.GetFiles(@"C:\Users\Administrator\Desktop\本天知识");

            //获取指定目录下【文件+文件夹】
            string[] paths = Directory.GetFileSystemEntries(@"C:\Users\Administrator\Desktop\本天知识");
            foreach (string path in paths)
            {
                //Console.WriteLine(path);
            }

            //仅获取所有子文件夹
            string[] files = Directory.GetDirectories(@"C:\Users\Administrator\Desktop\本天知识");
            foreach (var item in files)
            {
                //Console.WriteLine(item);
            }

            //删除空文件夹
            // Directory.Delete(@"C:\Users\Administrator\Desktop\FirstDay\新建文件夹");

            //强制删除非空文件夹(实例方式)
            // new DirectoryInfo(@"C:\Users\Administrator\Desktop\FirstDay\新建文件夹").Delete(true);
            #endregion

            #region 2.递归:斐波那契数列
            Console.WriteLine(FeiBo(8));
            #endregion

            #region 3.递归:遍历所有层级文件夹
            递归遍历文件夹(@"C:\Users\Administrator\Desktop\本天知识");
            #endregion
        }

        #region 递归遍历文件夹(支持多级子目录)
        /// <summary>
        /// 递归遍历文件夹,层级缩进展示
        /// </summary>
        /// <param name="path">目标文件夹路径</param>
        /// <param name="count">缩进层级,默认值0</param>
        void 递归遍历文件夹(string path, int count = 0)
        {
            //判断路径是否存在,不存在直接结束方法
            if (!Directory.Exists(path)) return;

            //根据层级生成空格,实现控制台缩进展示
            string s = new string(' ', count);

            //1.遍历当前目录下所有文件
            foreach (var item in Directory.GetFiles(path))
            {
                Console.WriteLine($"{s}:{Path.GetFileName(item)}");
            }

            //2.遍历当前目录下所有子文件夹
            foreach (var item in Directory.GetDirectories(path))
            {
                Console.WriteLine($"{s}文件夹:{Path.GetFileName(item)}");
                count += 2; //子目录增加缩进
                递归遍历文件夹(item, count); //递归调用,遍历子文件夹
            }
        }
        #endregion

        #region 递归实现斐波那契数列
        /// <summary>
        /// 递归计算斐波那契数列
        /// 规律:1 1 2 3 5 8 13...
        /// </summary>
        int FeiBo(int n)
        {
            //递归终止条件
            if (n == 1) return 1;
            if (n == 2) return 1;
            //核心公式:当前项 = 前一项 + 前前一项
            return FeiBo(n - 2) + FeiBo(n - 1);
        }
        #endregion
    }
}

三、Directory文件夹基础操作(分段拆解)

1、CreateDirectory() 创建文件夹

复制代码
Directory.CreateDirectory(@"C:\Users\Administrator\Desktop\FirstDay");

功能:创建指定路径文件夹;文件夹不存在自动创建,已存在不会报错,无任何副作用。

2、GetFiles() 获取所有文件

复制代码
string[] paths = Directory.GetFiles(@"文件夹路径");

功能:扫描指定目录,只获取所有文件,自动过滤文件夹;返回字符串数组,数组内存储每个文件的完整绝对路径。

3、GetDirectories() 获取所有文件夹

复制代码
string[] files = Directory.GetDirectories(@"文件夹路径");

功能:扫描指定目录,只获取所有子文件夹,自动过滤文件;仅读取当前一级目录,不递归读取子目录。

4、GetFileSystemEntries() 获取文件+文件夹

复制代码
string[] paths = Directory.GetFileSystemEntries(@"文件夹路径");

功能:一次性获取当前目录下所有文件、所有子文件夹,数据统一存入字符串数组。

三个获取方法总结

GetFiles() ------ 只获取文件

GetDirectories() ------ 只获取文件夹

GetFileSystemEntries() ------ 文件 + 文件夹一起获取

5、Delete() 删除空目录

复制代码
Directory.Delete(@"文件夹路径");

静态删除方法:仅能删除空文件夹,文件夹内包含文件/子目录时,直接程序报错。

6、Delete(true) 删除非空目录

复制代码
new DirectoryInfo(@"文件夹路径").Delete(true);

实例化删除方法:参数填写true,强制删除文件夹以及内部所有文件、子目录,直接永久删除,无法恢复。

四、递归知识点详解

1、递归定义:一个方法在方法内部调用自身

2、必备条件:必须设置终止条件,否则无限调用,造成内存溢出报错;

3、适用场景:层级重复业务,例如多级文件夹遍历、阶梯类数据计算。

五、案例一:递归实现斐波那契数列

1、数列规则

数列格式:1、1、2、3、5、8、13、21......

推导规则:从第三项开始,当前数值 = 前一项 + 前前一项

2、代码拆解

复制代码
int FeiBo(int n)
{
    //递归出口
    if (n == 1) return 1;
    if (n == 2) return 1;
    //自己调用自己
    return FeiBo(n - 2) + FeiBo(n - 1);
}

终止条件:n==1 和 n==2 直接返回1;

递归公式:return FeiBo(n - 2)+FeiBo(n - 1);

举例:FeiBo(8),程序层层递归拆解,最终叠加算出对应数值。

六、案例二:递归遍历多层文件夹(重难点)

复制代码
void 递归遍历文件夹(string path,int count=0) 
{
    //1.判断路径是否存在,不存在直接退出
    if (!Directory.Exists(path)) return; 

    //2.根据层级生成空格,用于控制台缩进
    string s = new string(' ', count);

    //3.遍历当前目录所有文件
    foreach (var item in Directory.GetFiles(path))
    {
        Console.WriteLine($"{s}:{Path.GetFileName(item)}");
    }

    //4.遍历当前目录所有子文件夹
    foreach (var item in Directory.GetDirectories(path))
    {
        Console.WriteLine($"文件夹:{Path.GetFileName(item)}");
        count += 2; //子文件夹增加缩进
        递归遍历文件夹(item,count); //递归:遍历子文件夹
    }
}

代码逐段解释

1、int count=0:默认参数,用来控制控制台缩进,区分层级;

2、Directory.Exists():判断文件夹是否存在,做容错处理;

3、new string(' ',count):生成指定数量空格,实现层级缩进;

4、第一层foreach:打印当前文件夹里面所有文件;

5、第二层foreach:打印子文件夹名称,缩进+2,再次调用自身,实现无限层级遍历。

1、方法参数

string path:需要遍历的根目录路径;int count=0:默认参数,用于控制控制台缩进,区分文件夹层级。

2、执行步骤

① 安全判断:通过Directory.Exists()判断路径是否存在,不存在直接退出;

② 生成缩进空格:根据count数值,给不同层级目录添加空格,排版更直观;

③ 遍历文件:读取当前目录所有文件,直接打印文件名;

④ 遍历文件夹:打印当前文件夹名称,缩进值+2;

⑤ 递归调用:将子文件夹路径传入方法,重复以上步骤,实现无限层级遍历。

七、核心方法汇总

1、CreateDirectory():创建文件夹;

2、GetFiles():只获取当前目录所有文件;

3、GetDirectories():只获取当前目录所有子文件夹;

4、GetFileSystemEntries():同时获取文件+文件夹;

5、Directory.Delete():删除空文件夹;

6、DirectoryInfo.Delete(true):强制删除非空文件夹。

八、知识点总结

1、Directory静态类全权负责文件夹操作,File静态类全权负责文件操作;

2、三个获取目录方法区别:仅文件、仅文件夹、文件+文件夹;

3、删除文件夹分两种:静态方法删空目录,实例方法强制删非空目录;

4、递归两大核心:终止条件 + 自身调用;

5、递归遍历文件夹,是处理多级目录最高效的方式。

九、易错点

1、静态Delete()不能删除带有文件的文件夹;

2、递归未设置终止条件,直接造成栈溢出崩溃;

3、Get系列方法只读取当前一级目录,不会自动读取子目录;

4、路径填写错误,Directory.Exists可提前规避路径报错问题。