一、知识点概述
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可提前规避路径报错问题。