AI 教程10月16日 12:34
🤖

不用AI,手写C语言实现一个树形目录查看器

从递归遍历到缩进输出,手把手带你用纯C写一个类似 tree 命令的目录查看器,顺便理解文件系统API和递归思维。

#C语言#文件系统#递归#命令行工具#编程入门

为什么值得手写一个 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 0 0

评论(0)

0/500 · 需登录

还没有评论

延伸阅读