學習目的:
- 熟悉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所示)