在Linux環境下,readdir函數被用來列出目錄里的文件與子目錄。通常情況下,readdir返回的結果會依據字典順序排列。不過,這樣的排序方式未必能滿足所有需求,尤其是在需要按特定條件(例如文件類型、最后修改日期等)來組織文件的時候。
若想實現自定義的排序邏輯,可以遵循以下步驟:
- 利用opendir和readdir加載目錄信息。
- 把獲取到的文件名存入一個結構體數組里,每個結構體不僅包含文件名還包含其他用于排序的信息(比如最后修改時間)。
- 調用qsort函數對結構體數組進行排序。這一步需要你編寫一個比較函數,根據你的排序標準來對比兩個結構體。
- 按照排序后的結構體數組順序展示文件名。
以下是一個例子,展示了如何依據文件的最后修改時間來對目錄中的文件進行排序:
#include <stdio.h> #include <stdlib.h> #include <dirent.h> #include <sys/stat.h> #include <string.h> #include <time.h> typedef struct { char name[256]; time_t mtime; } FileInfo; int compare_by_mtime(const void *a, const void *b) { FileInfo *file_a = (FileInfo *)a; FileInfo *file_b = (FileInfo *)b; return difftime(file_a->mtime, file_b->mtime); } int main() { DIR *dir = opendir("."); struct dirent *entry; FileInfo files[1024]; int i = 0; while ((entry = readdir(dir)) != NULL) { if (entry->d_type == DT_REG) { // 僅考慮常規文件 struct stat file_stat; stat(entry->d_name, &file_stat); strcpy(files[i].name, entry->d_name); files[i].mtime = file_stat.st_mtime; i++; } } closedir(dir); qsort(files, i, sizeof(FileInfo), compare_by_mtime); for (int j = 0; j <p>此示例代碼將讀取當前工作目錄內的所有常規文件,并按照它們的最后修改時間來進行排序。需要注意的是,這個示例并未涵蓋錯誤處理的情況,在實際應用中應當加入適當的錯誤檢測機制。</p> </time.h></string.h></sys/stat.h></dirent.h></stdlib.h></stdio.h>