溫馨提示×

Linux readdir如何實現文件大小排序

小樊
35
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
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女