在 Debian / Linux(glibc) 中,readdir 和 scandir 都是用来读取目录内容的函数,但它们在功能、使用方式和灵活性上有明显区别。
| 函数 | 头文件 | 标准 |
|---|---|---|
readdir |
<dirent.h> |
POSIX |
scandir |
<dirent.h> |
GNU / BSD 扩展(非 POSIX) |
#include <dirent.h>
DIR *opendir(const char *name);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
✅ 优点
❌ 缺点
. 和 ..)#include <dirent.h>
int scandir(const char *dirp,
struct dirent ***namelist,
int (*filter)(const struct dirent *),
int (*compar)(const struct dirent **,
const struct dirent **));
struct dirent **namelist;
int n = scandir(".", &namelist, NULL, alphasort);
for (int i = 0; i < n; i++) {
printf("%s\n", namelist[i]->d_name);
free(namelist[i]);
}
free(namelist);
✅ 优点
❌ 缺点
free| 对比项 | readdir | scandir |
|---|---|---|
| 标准 | POSIX ✅ | 非 POSIX ❌ |
| 读取方式 | 流式 | 一次性 |
| 是否排序 | 否 | 支持 |
| 是否过滤 | 手动 | 支持 filter |
| 内存占用 | 小 | 大 |
| 使用复杂度 | 稍高 | 更低 |
| 适合大目录 | ✅ | ❌ |
readdirscandirls 行为).conf 文件)scandir 在 glibc 中属于 GNU 扩展scandirreaddir 适合“流式、底层、可移植”读取目录;
scandir 适合“简单、完整、可排序过滤”的一次性读取。
如果你愿意,我可以给你一个 readdir vs scandir 的完整示例对比,或者讲讲它们在 内核 / VFS 层面的差异。