在 Ubuntu(Linux)下,使用 readdir() 读取目录时,readdir() 本身不会保证任何排序顺序(通常依赖于文件系统在目录项里的存储顺序,往往是“乱的”或按 inode 顺序)。
所以常见做法有两类:
用 readdir() 读取所有文件名,存到数组里,然后再排序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
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*),
(int (*)(const void*, const void*))strcmp);
for (int i = 0; i < count; i++) {
printf("%s\n", names[i]);
free(names[i]);
}
free(names);
return 0;
}
strcmp(a, b)
struct stat sa, sb;
stat(a, &sa);
stat(b, &sb);
return sa.st_mtime - sb.st_mtime;
return sa.st_size - sb.st_size;
. 和 ..if (strcmp(entry->d_name, ".") == 0 ||
strcmp(entry->d_name, "..") == 0)
continue;
如果你不是必须写 C 程序:
ls -1 | sort
ls -lt # 按时间
ls -lS # 按大小
for (auto &p : std::filesystem::directory_iterator("."))
std::cout << p.path() << "\n";
然后直接用 std::sort
readdir() 不支持排序参数如果你告诉我:
我可以给你更精确的代码。