在Linux中,你可以使用readdir
函数来读取目录中的文件和子目录。要实现按文件大小排序,你需要将读取到的文件信息存储在一个结构体数组中,然后使用qsort
函数对这个数组进行排序。以下是一个简单的示例:
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>
typedef struct {
char name[256];
off_t size;
} FileInfo;
int compare(const void *a, const void *b) {
FileInfo *fileA = (FileInfo *)a;
FileInfo *fileB = (FileInfo *)b;
return (fileA->size > fileB->size) - (fileA->size < fileB->size);
}
int main() {
DIR *dir;
struct dirent *entry;
FileInfo files[1024];
int count = 0;
dir = opendir(".");
if (dir == NULL) {
perror("opendir");
return 1;
}
while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_REG) { // 只处理普通文件
FileInfo fileInfo;
snprintf(fileInfo.name, sizeof(fileInfo.name), "%s", entry->d_name);
struct stat statbuf;
if (stat(fileInfo.name, &statbuf) == 0) {
fileInfo.size = statbuf.st_size;
files[count++] = fileInfo;
}
}
}
closedir(dir);
qsort(files, count, sizeof(FileInfo), compare);
for (int i = 0; i < count; i++) {
printf("%s: %ld bytes\n", files[i].name, files[i].size);
}
return 0;
}
这个程序首先定义了一个FileInfo
结构体,用于存储文件名和文件大小。然后,它使用opendir
和readdir
函数读取当前目录中的所有条目。对于每个条目,如果它是一个普通文件(而不是目录或其他类型的文件),则使用stat
函数获取文件大小,并将其添加到files
数组中。
接下来,使用qsort
函数对files
数组进行排序。compare
函数用于比较两个FileInfo
结构体的大小,以便qsort
知道如何对它们进行排序。
最后,程序遍历排序后的files
数组并打印文件名和大小。
注意:这个示例仅适用于处理当前目录中的文件。如果你想处理其他目录,可以将目录路径作为命令行参数传递给程序,并在opendir
函数中使用该路径。