在 Linux 下使用 readdir 读取目录时,readdir 本身并不保证任何顺序(通常是目录项在文件系统中的存储顺序)。如果你需要排序,一般做法是:
readdir 把所有目录项读出来qsort 或 C++ 的 std::sort)下面给你几种常见排序方式。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
struct Entry {
char name[256];
};
int compare(const void *a, const void *b) {
return strcmp(((struct Entry *)a)->name,
((struct Entry *)b)->name);
}
int main() {
DIR *dir = opendir(".");
if (!dir) return 1;
struct Entry entries[1024];
int count = 0;
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
strcpy(entries[count].name, entry->dname);
count++;
}
closedir(dir);
qsort(entries, count, sizeof(struct Entry), compare);
for (int i = 0; i < count; i++) {
printf("%s\n", entries[i].name);
}
return 0;
}
需要配合 stat
#include <sys/stat.h>
#include <time.h>
struct Entry {
char name[256];
time_t mtime;
};
int compare_time(const void *a, const void *b) {
return ((struct Entry *)a)->mtime -
((struct Entry *)b)->mtime;
}
读取时:
struct stat st;
stat(entry->d_name, &st);
entries[count].mtime = st.st_mtime;
. 和 ..if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
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);
✅ 自动按文件名排序
✅ 代码更简洁
ls -1 | sort
| 方式 | 是否排序 | 说明 |
|---|---|---|
readdir |
❌ | 需手动排序 |
scandir |
✅ | 推荐 |
readdir + qsort |
✅ | 灵活 |
如果你是 C / C++ / 嵌入式 / 特定文件系统(如 ext4、overlayfs),可以告诉我,我可以给更贴合的示例。