不用AI,手写C语言实现一个树形目录查看器
从递归遍历到缩进输出,手把手带你用纯C写一个类似 tree 命令的目录查看器,顺便理解文件系统API和递归思维。
为什么值得手写一个 tree 命令
每天打开终端,tree 命令都能把目录结构一目了然地铺开。但你想过它内部是怎么工作的吗?
现在很多人一遇到小工具就交给 AI 生成,结果代码能跑,自己却说不清原理。其实用 C 语言手写一个树形目录查看器,代码量不大,却能一次性搞懂三件事:目录遍历、递归、以及格式化输出。
这篇就带你从零实现一个简化版 tree,不需要任何 AI 辅助,纯靠标准库。
核心思路:递归就是树本身
目录结构天生是一棵树:文件夹是分支,文件是叶子。所以最自然的实现方式就是递归。
伪代码大概长这样:
```
打印当前目录名
对目录里每一项:
如果是目录,递归进入
如果是文件,直接打印
```
难点不在递归本身,而在于怎么把层级关系用缩进和连接符表达出来,让人一眼看出谁属于谁。
用到的关键函数
C 标准库提供了目录操作接口,主要在 <dirent.h> 和 <sys/stat.h> 里:
opendir():打开一个目录,返回目录流。readdir():逐个读取目录项,返回struct dirent *。closedir():用完关闭。stat():获取文件类型和属性,用来判断是目录还是普通文件。
注意 readdir() 返回的 d_name 里会包含 . 和 ..,遍历时要跳过,否则会无限递归。
处理缩进和连接符
要让输出好看,关键是维护一个「前缀字符串」。每深入一层,就给前缀追加一段空格或者竖线。
简化版可以这样做:
- 每层缩进 4 个空格。
- 目录名后面加一个
/方便区分。 - 最后一个子项用
└──,其余用├──。
如果嫌麻烦,第一版可以只做缩进,不做连接符,跑通后再优化。
完整代码骨架
```c
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>
void print_tree(const char *path, int depth) {
DIR *dir = opendir(path);
if (!dir) return;
登录解锁全文
以下内容需登录后阅读。注册/登录完全免费,无需付费。
评论(0)
还没有评论
延伸阅读
公众号
百宝软件工作室