在 Ubuntu(Linux) 上,readdir 是可以用来遍历目录的,而且这是最标准、最常用的方法之一。
readdir 是什么?readdir 是 POSIX 标准 API,定义在:
#include <dirent.h>
函数原型:
struct dirent *readdir(DIR *dirp);
它用于 逐个读取目录中的条目(文件、子目录、符号链接等)。
#include <stdio.h>
#include <dirent.h>
int main(int argc, char *argv[]) {
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;
}
✅ 在 Ubuntu 上完全可以编译运行:
gcc readdir_test.c -o readdir_test
./readdir_test
✅ 普通文件
✅ 子目录
✅ 隐藏文件(如 .bashrc)
✅ 符号链接
❌ 不会自动递归子目录(需要自己写递归)
void list_dir(const char *path) {
DIR *dir = opendir(path);
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_DIR) {
if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
char newpath[1024];
sprintf(newpath, "%s/%s", path, entry->d_name);
list_dir(newpath);
} else {
printf("%s/%s\n", path, entry->d_name);
}
}
closedir(dir);
}
readdir vs readdir_rreaddir:线程不安全(但简单)readdir_r:线程安全(已逐渐废弃)readdirreaddir 只返回目录项,不解析真实路径
如需判断真实文件类型,用:
lstat() / stat()
system("ls") 高效得多<filesystem>(C++17)os.listdir / os.scandirfind如果你是想问:
可以告诉我你的使用场景,我可以进一步说明。