1. 程式人生 > 實用技巧 >Linux的scandir函式

Linux的scandir函式

學習目的:

  • 熟悉linux下scandir函式的使用

1、函式的功能

  遍歷指定目錄下滿足某種過濾模式的檔案,返回結果可通過指定函式進行排序,並將返回的子目錄資訊(不遞迴遍歷子目錄的目錄)存放到函式內部動態分配的記憶體中,我們可通過訪問返回結果獲取當前路徑下目錄的資訊。


2、函式的原型

int scandir(const char *dirp, struct dirent ***namelist,
              int (*filter)(const struct dirent *),
              int (*compar)(const struct dirent **, const
struct dirent **));

dirp: 指定掃描的目錄

namelist: struct dirent結構體型別的三級指標,用於獲取該函式內部為存放返回結果的分配的動態記憶體

scadir函式內部使用malloc動態分配記憶體,用以儲存遍歷到的目錄相關資訊,動態分配記憶體結構如圖2-1所示。分配的記憶體包含兩個部分,一部分是struct dirent型別指標(一段連續記憶體,可看成指標陣列),用於指向malloc分配用來存放目錄資訊記憶體地址,另一部分是malloc分配struct dirent大小記憶體,存放遍歷目錄或檔案的相關資訊。若想獲取目錄相關資訊,需要先獲取指向該存放記憶體的指標,即圖2-1中的strcut dirent *arr[N]指標陣列地址。

圖2-1 scandir函式內部儲存目錄動態記憶體描述

filter: 函式指標,指向過濾模式函式。當filter指標設定為NULL時,掃描dirp目錄下的所有頂層檔案

compar: 函式指標,指向對遍歷結果進行排序函式,alphasort函式和versionsort是經常用到的函式,alphasort根據字母先後對返回結果進行排序


3、函式使用

scandir_test.c----->參考man page提供程式碼

#define _SVID_SOURCE
 /* print files in current directory in reverse order */
#include 
<dirent.h> int main(void) { struct dirent **namelist; int n; n = scandir(".", &namelist, NULL, alphasort); if (n < 0) perror("scandir"); else { while (n--) { printf("%s\n", namelist[n]->d_name); free(namelist[n]); //------------------------>①每訪問完一條目錄或檔案資訊,釋放由malloc分配的用於存放該資訊的動態記憶體 } free(namelist); //------------------------>②訪問完指定目錄下所有目錄或檔案資訊內容,釋放malloc分配的用於索引的指標陣列記憶體 } }

注:使用scandir函式獲取相關資訊之後,務必像上述程式碼①、②所示呼叫free函式釋放內部由malloc分配記憶體(記憶體結構描述如圖2-1所示)