debian readdir是否支持自定義排序

readdir 函數本身不提供自定義排序功能,它返回的目錄條目順序取決于底層文件系統。 要實現自定義排序,需要在讀取目錄后,使用程序代碼進行排序。

debian readdir是否支持自定義排序

以下示例演示如何結合 readdir 和 qsort 對目錄中的文件名進行排序:

#include <stdio.h> #include <stdlib.h> #include <dirent.h> #include <string.h>  //比較函數,用于qsort int compare(const void *a, const void *b) {     return strcmp(*(const char **)a, *(const char **)b); }  int main() {     DIR *dir;     struct dirent *entry;     char **filenames; // 使用char**動態分配內存,更靈活     int count = 0;     int i;      dir = opendir(".");     if (dir == NULL) {         perror("opendir");         return 1;     }      // 首先獲取目錄條目數量,以便動態分配內存     while ((entry = readdir(dir)) != NULL) {         count++;     }     rewinddir(dir); // 重置目錄流指針      filenames = (char **)malloc(count * sizeof(char *));     if (filenames == NULL) {         perror("malloc");         closedir(dir);         return 1;     }      count = 0; // 重置計數器     while ((entry = readdir(dir)) != NULL) {         if (entry->d_type == DT_REG) { // 只處理普通文件             filenames[count] = strdup(entry->d_name);             if (filenames[count] == NULL) {                 perror("strdup");                 // 處理內存分配失敗                 for (i = 0; i < count; i++) {                     free(filenames[i]);                 }                 free(filenames);                 closedir(dir);                 return 1;             }             count++;         }     }     closedir(dir);       qsort(filenames, count, sizeof(char *), compare);      for (i = 0; i < count; i++) {         printf("%sn", filenames[i]);         free(filenames[i]); // 釋放strdup分配的內存     }     free(filenames); // 釋放filenames數組的內存      return 0; }

此代碼首先使用 readdir 讀取目錄中的所有條目,然后使用 qsort 進行排序,最后打印排序后的文件名并釋放所有動態分配的內存,避免內存泄漏。 改進之處在于動態分配內存,避免了固定大小數組的限制,并添加了錯誤處理和內存釋放。 記住編譯時需要鏈接 -lm (用于 malloc 和 free)。

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享