Posted on 2013-01-02 11:48
鑫龍 閱讀(3211)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
linux編程
首先看一下man的scandir 接口定義
int scandir(const char *dir, struct dirent ***namelist, int(*filter)(const struct dirent *), int(*compar)(const struct dirent **, const struct dirent **));
|
,從定義來(lái)看就不是一個(gè)簡(jiǎn)單的函數(shù),形參里,出現(xiàn)一個(gè)三級(jí)指針,二個(gè)函數(shù)指針。它的功能是,掃描名字為dir的目錄,把滿(mǎn)足filter函數(shù)的過(guò)濾條件(即filter執(zhí)行為非0值)的目錄項(xiàng)加入到一維指針數(shù)組namelist.數(shù)組的總長(zhǎng)度為返回值n,如果compar不為空,則最終輸出結(jié)果還要調(diào)用qsort來(lái)對(duì)數(shù)組進(jìn)行排序后再輸出。
從scandir的演示代碼,我們可以推算出namelist是一個(gè)指向一維指針數(shù)組的指針。(一維指針數(shù)組等同于 struct dirent ** namelist,這里寫(xiě)在三級(jí)指針是因?yàn)橐獜暮瘮?shù)里改變namelist的值,必須再多做一級(jí))原因可以參考我的函數(shù)傳值類(lèi)型的說(shuō)明。
以下是一個(gè)簡(jiǎn)單掃描 /usr/lib,并且把所有以lib打頭的文件掃描到namelist數(shù)組的測(cè)試程序,這是參考scandir 提供的樣例來(lái)修改,alphasort是做原始的ASCII碼值比較進(jìn)行排序的
可以看到namelist是完全動(dòng)態(tài)分配的,不僅數(shù)組本身是動(dòng)態(tài)分配,而且數(shù)組項(xiàng)指向的空間也是動(dòng)態(tài)分配的。
#include <sys/types.h> #include <dirent.h>
#include <sys/stat.h> #include <unistd.h>
#include <stdio.h> #include <errno.h> #include <string.h> #include <stdlib.h>
//掃描所有的lib打頭的文件
int filter_fn(const struct dirent * ent) { if(ent->d_type != DT_REG) return 0; return (strncmp(ent->d_name,"lib",3) == 0); }
void scan_lib(char * dir_name) { int n; struct dirent **namelist; // struct dirent * namelist[];
n = scandir(dir_name, &namelist, filter_fn, alphasort); if (n < 0) perror("scandir"); else { while(n--) { printf("%s\n", namelist[n]->d_name); free(namelist[n]); } free(namelist); } }
int main(int argc ,char * argv[]) { scan_lib("/usr/lib"); }
|