• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 200, comments - 8, trackbacks - 0, articles - 0

            scandir 函數(shù)

            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 (< 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"); 
            }


            97久久超碰成人精品网站| 久久久久久久久久免免费精品| 99久久久精品免费观看国产| 久久久久这里只有精品| 久久久久亚洲Av无码专| 久久久www免费人成精品| 中文字幕无码久久人妻| 日韩久久无码免费毛片软件| 久久九九久精品国产| 久久国产精品免费一区二区三区| 国产色综合久久无码有码| 欧美精品一区二区精品久久| 国内精品人妻无码久久久影院| 国产精品对白刺激久久久| 久久香蕉超碰97国产精品| 一本色道久久88—综合亚洲精品| 亚洲av成人无码久久精品| 亚洲va国产va天堂va久久| 无码日韩人妻精品久久蜜桃| 国内精品久久久久久久久电影网| 久久精品成人欧美大片| 久久久久久曰本AV免费免费| 国产成人精品综合久久久久 | 久久九九青青国产精品| 久久天堂电影网| 久久精品亚洲乱码伦伦中文| 尹人香蕉久久99天天拍| 久久久噜噜噜久久熟女AA片| 久久99久久99小草精品免视看 | 人妻无码久久精品| 亚洲性久久久影院| 久久国产色AV免费看| 狠狠色综合网站久久久久久久| 国产香蕉97碰碰久久人人| 精品国产乱码久久久久软件| 久久成人国产精品| 亚洲婷婷国产精品电影人久久| 7777精品久久久大香线蕉| 日韩精品久久无码人妻中文字幕| 品成人欧美大片久久国产欧美...| 久久亚洲国产最新网站|