在 Ubuntu(以及大多数 Linux 发行版)上,readdir 返回的目录项顺序并不是按文件名排序的,这是正常行为,不是 bug。
readdir()(以及底层 getdents 系统调用)返回的顺序,取决于文件系统在磁盘上的存储方式,常见情况有:
/tmp)所以你看到“顺序错乱”,其实是:
readdir 本来就不保证顺序
The order in which filenames are read by successive calls to
readdir()is unspecified.
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
输出可能是:
file3
file1
file10
file2
而不是字母序。
// 先把文件名存起来,再 qsort
scandir(推荐)struct dirent **namelist;
int n = scandir(".", &namelist, NULL, alphasort);
for (int i = 0; i < n; i++) {
printf("%s\n", namelist[i]->d_name);
}
scandir 会自动排序(可用 alphasort 或自定义比较函数)。
ls | sort
❌ “Ubuntu 的 readdir 有问题”
✅ 其实是 POSIX 标准就不保证顺序
❌ “和 Windows 不一样,是 Bug”
✅ Windows FindFirstFile 也不保证顺序,只是通常看起来像排序
readdir 顺序错乱 = 正常scandir如果你愿意,可以告诉我:
我可以给你更具体的代码示例。