欢迎光临
我们一直在努力

C# Directory目录操作 + 递归算法 + using资源释放 全套笔记

一、前置说明

本文核心三大模块:Directory文件夹静态操作类、递归算法实战(斐波那契+文件夹遍历)、using自动释放资源机制,属于IO编程进阶核心考点。

必备命名空间:using System.IO;、using System.Text;


二、Directory 文件夹静态操作类(核心)

Directory 是静态工具类,专门用于 文件夹/目录 的创建、删除、查询、遍历,无需实例化,直接调用静态方法。

1. 基础目录操作代码

// 1. 创建目录(不存在则创建,存在不报错)
Directory.CreateDirectory(@"C:\\Users\\Administrator\\Desktop\\FirstDay");

// 2. 获取指定目录下【所有文件】的完整路径数组
string[] paths = Directory.GetFiles(@"C:\\Users\\Administrator\\Desktop\\本天知识");

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

// 4. 删除【空目录】(只能删空文件夹)
Directory.Delete(@"C:\\Users\\Administrator\\Desktop\\FirstDay\\新建文件夹");

// 5. 删除【非空目录】(递归删除所有子文件子文件夹)
new DirectoryInfo(@"C:\\Users\\Administrator\\Desktop\\FirstDay\\新建文件夹").Delete(true);

2. 核心方法考点区分

  • GetFiles():只获取当前目录下的文件,不包含文件夹

  • GetDirectories():只获取当前目录下的子文件夹

  • GetFileSystemEntries():文件+文件夹全部获取

  • Directory.Delete(path):仅删除空文件夹,有内容直接报错

  • DirectoryInfo.Delete(true):参数true代表递归删除,可删除非空文件夹

  • Directory.Exists(path):判断文件夹是否存在(防报错必备)


三、递归算法核心原理

1. 递归定义

递归:方法内部调用自身,必须设置递归终止条件,否则死循环、栈溢出报错。

适用场景:层级嵌套结构,如多级文件夹遍历、树形结构、斐波那契数列等。

2. 递归必备两大条件

  • 终止条件:防止无限递归

  • 递推公式:自身调用、参数逐步趋近终止条件


四、递归实战1:斐波那契数列

1. 数列规则

1、1、2、3、5、8、13… 规则:前两项固定为1,从第三项开始当前值 = 前一项 + 前两项

2. 完整递归代码

// 获取第n项斐波那契数
int FeiPo(int n)
{
// 递归终止条件
if (n == 1)
{
return 1;
}
if (n == 2)
{
return 1;
}
// 递推公式:当前项 = 前一项 + 前两项
return FeiPo(n – 2) + FeiPo(n – 1);
}

// 调用:获取第8项
Console.WriteLine(FeiPo(8));

3. 递归拆解示例(n=5)

FeiPo(5) = FeiPo(3) + FeiPo(4) FeiPo(3) = FeiPo(1)+FeiPo(2) = 1+1=2 FeiPo(4) = FeiPo(2)+FeiPo(3) = 1+2=3 最终结果:2+3 = 5


五、递归实战2:多级文件夹深度遍历(重难点)

功能:遍历指定文件夹,遍历所有文件 + 所有子文件夹 + 子文件夹内的所有文件,无限层级深度遍历,自带缩进层级展示。

1. 完整源码

// 递归遍历文件夹,count控制层级缩进
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)}");
// 层级+2,子目录缩进加深
count += 2;
// 递归:遍历子文件夹内部
递归遍历文件夹(item, count);
}
}

// 调用方法:遍历目标路径所有层级文件
递归遍历文件夹(@"C:\\Users\\Administrator\\Desktop\\本天知识");

2. 核心逻辑解析

  • 默认参数count=0:默认顶级目录无缩进,递归传参实现层级加深

  • Directory.Exists:容错终止,路径无效直接返回

  • 先遍历文件、再遍历文件夹,文件夹内部再次递归

  • Path.GetFileName():截取文件/文件夹名称,剔除超长路径


六、using 语法:自动释放资源(终极优化)

1. using核心作用

所有IO流(FileStream、StreamReader、StreamWriter)都实现了 IDisposable 释放接口。 using语法:代码块执行完毕后,自动执行Dispose释放资源,无需手动写Close()、Dispose(),杜绝文件占用、内存泄漏。

2. using文件读写完整实战代码

// 1. 字符串转字节数组
string s = "aaabvbbv哈兰德";
byte[] bs = Encoding.Default.GetBytes(s);

// 2. using 追加写入文件(自动释放)
using (FileStream fs = new FileStream(@"1.txt", FileMode.Append))
{
fs.Write(bs, 0, bs.Length);
}
// 出大括号,fs自动释放,无需手动Close/Dispose

// 3. using 读取文件(自动释放)
byte[] rece = new byte[1024 * 1024 * 5];
using (FileStream fs = new FileStream(@"1.txt", FileMode.Open))
{
int l = fs.Read(rece, 0, rece.Length);
string ss = Encoding.Default.GetString(rece, 0, l);
Console.WriteLine(ss);
MessageBox.Show(ss);
}

3. using 核心考点

  • using 仅对 实现IDisposable接口 的对象生效(所有IO流全部支持)

  • 代码块 {} 执行结束,立即释放资源

  • 简化代码、避免遗忘关闭流、杜绝文件被持续占用

  • 替代传统:fs.Close(); + fs.Dispose(); 两行代码


七、全套易错点汇总

  • Directory.Delete() 默认只能删空文件夹,非空必须用 DirectoryInfo.Delete(true)

  • 递归必须写终止条件,否则栈溢出报错

  • GetFiles 只取文件、GetDirectories只取文件夹,不能混用

  • using 作用域仅限大括号内,出括号对象直接释放,无法继续使用

  • IO流优先使用 using,禁止手动写Close忘记释放


八、终极背诵口诀

Directory管文件夹,增删查询静态揽;

递归自调用自身,终止条件保平安;

斐波递推前后和,文件夹遍历层层传;

using自动释资源,无需关闭最安全。

赞(0)
未经允许不得转载:171主机测评 » C# Directory目录操作 + 递归算法 + using资源释放 全套笔记
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址