在 Linux 下使用 readdir() 读取目录时,默认顺序是不确定的(通常是文件系统返回的顺序,不一定是字母序)。如果你想要“排序文件”,常见的做法有下面几种。
readdir() 只负责逐个读取目录项:
struct dirent *entry;
DIR *dir = opendir(".");
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
⚠️ 这个输出不是排序的。
scandir()(最简单)scandir() 是 专门为排序设计的。
#include <dirent.h>
#include <stdio.h>
int main() {
struct dirent **namelist;
int n = scandir(".", &namelist, NULL, alphasort);
if (n < 0) 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:按版本号排序(如 file1, file2, file10)
如果你必须用 readdir:
#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))) {
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);
}
| 排序方式 | 方法 |
|---|---|
| 字母序 | alphasort / strcmp |
| 版本序 | versionsort |
| 修改时间 | 读 stat(),按 st_mtime |
| 文件大小 | stat() + st_size |
| 反向排序 | 排序后反转 |
ls -1 | sort
ls -lt # 按时间
ls -lS # 按大小
scandir() ✅qsortreaddir 本身 不会排序如果你愿意,我可以按你的具体需求(比如按时间 / 只列文件 / 忽略 . 和 ..)写完整示例。