Linux的scandir函式
阿新 • • 發佈:2020-07-16
學習目的:
- 熟悉linux下scandir函式的使用
1、函式的功能
遍歷指定目錄下滿足某種過濾模式的檔案,返回結果可通過指定函式進行排序,並將返回的子目錄資訊(不遞迴遍歷子目錄的目錄)存放到函式內部動態分配的記憶體中,我們可通過訪問返回結果獲取當前路徑下目錄的資訊。
2、函式的原型
int scandir(const char *dirp, struct dirent ***namelist, int (*filter)(const struct dirent *), int (*compar)(const struct dirent **, conststruct 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所示)