在 CentOS(Linux) 下,如果你是想 替代 readdir(目录遍历),常见原因有:性能、功能限制、递归遍历、并发等。下面按使用场景给你几种替代方案。
readdir 的替代方案getdents / getdents64(系统调用)readdir 其实是对 getdents 的封装,更底层、更快。
#include <dirent.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <linux/dirent.h>
// 直接用 syscall(SYS_getdents64, fd, buf, size)
✅ 优点
❌ 缺点
scandir(排序 + 过滤)如果你需要排序或过滤:
struct dirent **namelist;
int n = scandir(".", &namelist, NULL, alphasort);
✅ 优点
❌ 缺点
fts_open / fts_read(递归遍历推荐)最推荐的目录遍历方式
FTS *fts = fts_open(argv, FTS_NOCHDIR, NULL);
FTSENT *ent;
while ((ent = fts_read(fts))) {
if (ent->fts_info == FTS_F)
printf("%s\n", ent->fts_path);
}
fts_close(fts);
✅ 优点
readdir 的方式find(最常用)find /path -type f
ls + xargsls -1 | xargs -I{} echo {}
rsync(超大数据量)rsync -a --out-format='%n' /path/ /dev/null
| 场景 | 推荐 |
|---|---|
| 普通遍历 | readdir |
| 高性能 | getdents64 |
| 递归 | fts_* |
| Shell | find |
| 百万文件 | getdents64 / rsync |
可以告诉我:
我可以给你对应语言的最佳替代方案。