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所示)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM