在 Debian(或者说 Linux 下 C 语言编程)里,readdir() 本身不会排序,它返回的是目录项在底层文件系统中的顺序(通常是哈希或无序的)。
如果你想要“排序结果”,通常有以下几种做法。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
int compare(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);
count++;
}
closedir(dir);
qsort(names, count, sizeof(char*), compare);
for (int i = 0; i < count; i++) {
printf("%s\n", names[i]);
free(names[i]);
}
free(names);
return 0;
}
✅ 优点:可控(可按名、时间、大小排序)
❌ 缺点:代码稍多
scandir()(最推荐)scandir() 直接返回排序后的结果
#include <stdio.h>
#include <dirent.h>
int main() {
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);
return 0;
}
alphasort:按字母排序versionsort:按版本号排序(Debian/GNU 扩展).txt)✅ 最简单、最常用
如果你是脚本或命令:
ls -1 | sort
ls -t # 按时间
ls -S # 按大小
| 方式 | 是否排序 | 说明 |
|---|---|---|
| readdir | ❌ | 需手动排序 |
| scandir | ✅ | 推荐 |
| ls | ✅ | 用户态 |
scandir()readdir() + qsort()ls | sort如果你告诉我:
我可以直接给你完整示例。