在 Ubuntu(Linux)下,opendir 和 readdir 通常配合用来遍历一个目录中的所有文件和子目录。它们都来自 <dirent.h>。
下面从 基本用法 → 示例代码 → 注意事项 给你讲清楚。
opendirDIR *opendir(const char *name);
DIR* 指针NULLreaddirstruct dirent *readdir(DIR *dirp);
struct dirent*NULLopendir → readdir(循环) → closedir
#include <stdio.h>
#include <dirent.h>
int main() {
DIR *dir;
struct dirent *entry;
dir = opendir(".");
if (dir == NULL) {
perror("opendir");
return 1;
}
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
编译运行:
gcc listdir.c -o listdir
./listdir
struct dirent {
ino_t d_ino;
off_t d_off;
unsigned short d_reclen;
unsigned char d_type;
char d_name[256];
};
常用:
d_name:文件名d_type:
DT_REG 普通文件DT_DIR 目录while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_REG) {
printf("File: %s\n", entry->d_name);
}
}
. 和 ..if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
if (entry->d_type == DT_DIR) {
// 拼接路径
// 再次 opendir + readdir
}
注意:递归时要避免死循环(如符号链接)
❌ 忘记 closedir
❌ readdir 不是线程安全的(可用 readdir_r)
❌ 把 readdir 当“读文件内容”(它是读目录项)
如果你愿意,我也可以给你:
std::filesystem 版本你想看哪一种?