在 Debian(以及大多数 Linux) 里,readdir 本身并不是被“废弃”,但它有不同版本和替代方案,取决于你的使用场景。下面按常见需求给你一个清晰对照。
readdir 家族(POSIX 标准,一直可用)这些在 Debian 上完全可用,不是“过时”:
#include <dirent.h>
DIR *opendir(const char *name);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);
✅ 推荐用于:C 程序遍历目录
示例:
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir))) {
printf("%s\n", entry->d_name);
}
closedir(dir);
readdir_r 已被废弃(⚠️ 注意)int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
❌ POSIX.1-2008 起标记为废弃 ❌ 不推荐在新代码中使用
✅ 替代方案:直接用 readdir()
原因:
readdir() 在 glibc 中已是线程安全(内部使用锁)readdir_r 使用复杂、容易出错std::filesystem(C++17)#include <filesystem>
namespace fs = std::filesystem;
for (auto &p : fs::directory_iterator(".")) {
std::cout << p.path() << '\n';
}
✅ 现代、跨平台、推荐
for f in *; do
echo "$f"
done
或:
ls -1
getdents() / getdents64()#include <sys/syscall.h>
#include <linux/dirent.h>
⚠️ 不推荐普通程序使用
✅ 只用于:
| 场景 | 推荐 |
|---|---|
| C | opendir/readdir |
| C++ | std::filesystem |
| Python | os.listdir / os.scandir |
| Rust | std::fs::read_dir |
❌ “Debian 不支持 readdir”
✅ 完全支持
❌ “readdir 不安全”
✅ 只要不用 readdir_r 就没问题
Debian 上
readdir的替代方案是:
| 情况 | 替代 |
|---|---|
废弃的 readdir_r |
✅ 用 readdir() |
| C++ | ✅ std::filesystem |
| 高性能底层 | ✅ getdents64() |
| 脚本 | ✅ shell / Python |
如果你愿意,可以告诉我:
我可以直接给你最合适的实现示例。