在 Debian(Linux)下,readdir 本身不会排序,它返回目录项的顺序是文件系统决定的(通常是目录项在磁盘上的顺序),并不保证字母序或任何排序。
如果你想要“排序”,常见做法有下面几种。
readdir + scandir(最简单,推荐)scandir 本身就是基于 readdir 的封装,并且支持排序。
#define _DEFAULT_SOURCE
#include <dirent.h>
#include <stdio.h>
int main() {
struct dirent **namelist;
int n = scandir(".", &namelist, NULL, alphasort);
if (n < 0) {
perror("scandir");
return 1;
}
for (int i = 0; i < n; i++) {
printf("%s\n", namelist[i]->d_name);
free(namelist[i]);
}
free(namelist);
return 0;
}
✅ alphasort:按字典序排序
✅ versionsort:按版本号排序(Debian/glibc 支持)
readdir + qsort#define _DEFAULT_SOURCE
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void *a, const void *b) {
return strcmp(*(const char **)a, *(const char **)b);
}
int main() {
DIR *dir = opendir(".");
struct dirent *entry;
char **names = NULL;
int count = 0;
while ((entry = readdir(dir)) != NULL) {
names = realloc(names, sizeof(char*) * (count + 1));
names[count++] = strdup(entry->d_name);
}
closedir(dir);
qsort(names, count, sizeof(char*), cmp);
for (int i = 0; i < count; i++) {
printf("%s\n", names[i]);
free(names[i]);
}
free(names);
}
ls # 默认排序
ls -1 # 每行一个
ls -v # 版本排序
ls -t # 按时间
import os
for name in sorted(os.listdir(".")):
print(name)
| 方式 | 是否排序 | 说明 |
|---|---|---|
readdir |
❌ | 不排序 |
scandir |
✅ | 推荐 |
readdir + qsort |
✅ | 手动 |
ls |
✅ | 用户态排序 |
如果你是想:
可以告诉我具体场景,我可以给你更合适的方案。