在 Debian(其实任何 Linux,只要是 C/C++)里,readdir 是用来读取目录内容的函数,属于 POSIX 标准,定义在 <dirent.h> 里。下面按常见用法给你一个完整说明。
readdir 用来逐个读取目录中的文件和子目录:
#include <dirent.h>
| 函数 | 作用 |
|---|---|
opendir() |
打开目录 |
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 readdir_example.c -o readdir_example
./readdir_example
struct dirent {
ino_t d_ino; // inode号
off_t d_off; // 偏移
unsigned short d_reclen; // 记录长度
unsigned char d_type; // 文件类型
char d_name[256]; // 文件名
};
if (entry->d_type == DT_REG) // 普通文件
if (entry->d_type == DT_DIR) // 目录
⚠️ d_type 在某些文件系统(如 XFS)上可能不可用。
. 和 ..while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
printf("%s\n", entry->d_name);
}
可以,但它是 C 接口。
#include <iostream>
#include <dirent.h>
int main() {
DIR *dir = opendir(".");
if (!dir) return 1;
dirent *entry;
while ((entry = readdir(dir)) != nullptr) {
std::cout << entry->d_name << std::endl;
}
closedir(dir);
}
如果你用的是 C++17 或以上,更推荐用 <filesystem>:
#include <filesystem>
#include <iostream>
int main() {
for (auto &p : std::filesystem::directory_iterator(".")) {
std::cout << p.path() << std::endl;
}
}
编译:
g++ -std=c++17 fs_example.cpp -o fs_example
opendir(...) 后必须 closedir(...)
用 stat() 更可靠:
#include <sys/stat.h>
✅ Debian 下 readdir 用法和标准 Linux 一样
✅ 适合 C / C++
✅ 新项目建议用 std::filesystem
如果你需要:
readdir 做 ls 命令可以告诉我你的具体需求,我可以给你对应代码。