在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
函數中使用該路徑。