在 Debian(以及大多数 Linux 发行版)中,readdir() 本身没有固定的排序规则,其返回的目录项顺序由底层文件系统决定。
readdir() 的行为readdir()(及 readdir_r())按文件系统存储顺序返回目录项ls 的区别很多人误以为 readdir() 是排序的,是因为:
ls
默认会 按字母序排序。
但 ls 实际做了:
readdir() → 获取所有文件名 → 排序 → 输出
✅ 必须自己在用户态排序
常见做法(C 语言):
#include <dirent.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void *a, const void *b) {
return strcmp(*(const char **)a, *(const char **)b);
}
void readdir_sorted(const char *path) {
DIR *dir = opendir(path);
struct dirent *ent;
const char **names = NULL;
size_t count = 0;
while ((ent = readdir(dir))) {
names = realloc(names, (count + 1) * sizeof(char *));
names[count++] = strdup(ent->d_name);
}
qsort(names, count, sizeof(char *), cmp);
for (size_t i = 0; i < count; i++) {
printf("%s\n", names[i]);
free((void *)names[i]);
}
free(names);
closedir(dir);
}
Debian / Linux 中
readdir()默认没有排序规则,顺序由文件系统决定。如果需要按名称排序,必须自行排序,不能依赖
readdir()的返回顺序。
如果你关心的是 POSIX 规范、特定文件系统(如 ext4)行为,或 Python / shell / Go / Rust 的表现,我可以继续深入。