在 Ubuntu(Linux)下,使用 opendir() + readdir() 读取目录时,读取顺序是由底层文件系统决定的,而不是按文件名排序的。
opendir() / readdir() 不保证任何顺序ext4:通常是大致按创建/插入顺序,但不是严格排序xfs / btrfs:顺序更不可预测tmpfs:通常是插入顺序DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
输出可能是:
file3
file1
file2
必须自己排序:
scandir()(推荐)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);
qsort// readdir 后存 char* 数组,再用 strcmp 排序
❌ “readdir 是按字母顺序” ✅ 不是,除非你显式排序
❌ “同一个目录顺序永远一样” ✅ 不一定,尤其文件系统不同或目录被修改过
| 方式 | 是否有序 |
|---|---|
| opendir + readdir | ❌ 无序 |
| scandir + alphasort | ✅ 字母序 |
| 手动排序 | ✅ 任意顺序 |
如果你关心的是 性能、并发、或特定文件系统行为,可以告诉我具体场景。