linux

Linux readdir如何实现文件大小排序

小樊
32
2025-05-20 20:15:53
栏目: 智能运维

在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结构体,用于存储文件名和文件大小。然后,它使用opendirreaddir函数读取当前目录中的所有条目。对于每个条目,如果它是一个普通文件(而不是目录或其他类型的文件),则使用stat函数获取文件大小,并将其添加到files数组中。

接下来,使用qsort函数对files数组进行排序。compare函数用于比较两个FileInfo结构体的大小,以便qsort知道如何对它们进行排序。

最后,程序遍历排序后的files数组并打印文件名和大小。

注意:这个示例仅适用于处理当前目录中的文件。如果你想处理其他目录,可以将目录路径作为命令行参数传递给程序,并在opendir函数中使用该路径。

0
看了该问题的人还看了