在 Debian(以及所有 Linux)里,readdir 本身是不能递归的。
readdir 只能读取一个目录里的直接内容readdir 是什么readdir 是 POSIX 标准 C 库函数,用来读取 一个已经打开的目录流(DIR*) 中的目录项。
#include <dirent.h>
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
它只会返回:
. 和 ..不会自动进入子目录
readdir 的设计目标是:
一次只处理一层目录
如果需要递归,你必须:
entry->d_type == DT_DIR. 和 ..opendir + readdir#include <stdio.h>
#include <dirent.h>
#include <string.h>
void list_dir(const char *path) {
DIR *dir = opendir(path);
if (!dir) return;
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
printf("%s/%s\n", path, entry->d_name);
if (entry->d_type == DT_DIR) {
char newpath[1024];
snprintf(newpath, sizeof(newpath), "%s/%s", path, entry->d_name);
list_dir(newpath); // 递归
}
}
closedir(dir);
}
int main() {
list_dir(".");
return 0;
}
readdir 能像 find 一样递归find . -type f
这是 用户态工具,内部也是递归实现的。
d_type 一定可靠?在部分文件系统(如某些 NFS)上:
entry->d_type == DT_UNKNOWN
这时需要用 lstat() 判断类型。
nftw(推荐)#include <ftw.h>
int fn(const char *path, const struct stat *sb, int type, struct FTW *ftwbuf) {
printf("%s\n", path);
return 0;
}
int main() {
nftw(".", fn, 20, FTW_PHYS);
}
✅ 自动递归
✅ Debian 自带
✅ 比手写 readdir 安全
| 问题 | 答案 |
|---|---|
readdir 能递归吗 |
❌ 不能 |
| 需要递归怎么办 | ✅ 自己递归 / 用 nftw |
| Debian 是否支持 | ✅ 完全支持 |
如果你愿意,可以告诉我:
我可以给你最合适的示例。