• <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 函數

            Posted on 2013-01-02 11:48 鑫龍 閱讀(3212) 評論(0)  編輯 收藏 引用 所屬分類: linux編程
            首先看一下man的scandir 接口定義
            int scandir(const char *dir, struct dirent ***namelist,
                          int(*filter)(const struct dirent *),
                          int(*compar)(const struct dirent **, const struct dirent **));
            ,從定義來看就不是一個簡單的函數,形參里,出現一個三級指針,二個函數指針。它的功能是,掃描名字為dir的目錄,把滿足filter函數的過濾條件(即filter執行為非0值)的目錄項加入到一維指針數組namelist.數組的總長度為返回值n,如果compar不為空,則最終輸出結果還要調用qsort來對數組進行排序后再輸出。
             
            從scandir的演示代碼,我們可以推算出namelist是一個指向一維指針數組的指針。(一維指針數組等同于 struct dirent ** namelist,這里寫在三級指針是因為要從函數里改變namelist的值,必須再多做一級)原因可以參考我的函數傳值類型的說明。
             
            以下是一個簡單掃描 /usr/lib,并且把所有以lib打頭的文件掃描到namelist數組的測試程序,這是參考scandir 提供的樣例來修改,alphasort是做原始的ASCII碼值比較進行排序的
             
            可以看到namelist是完全動態分配的,不僅數組本身是動態分配,而且數組項指向的空間也是動態分配的。
             
             

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


            精品欧美一区二区三区久久久| 久久久精品国产亚洲成人满18免费网站| 国产成人久久久精品二区三区| 国产精品热久久无码av| 欧美大战日韩91综合一区婷婷久久青草| 中文成人久久久久影院免费观看| 亚洲午夜精品久久久久久浪潮 | 久久99国产精品久久| 精品国产91久久久久久久a| 久久久久高潮综合影院| 久久被窝电影亚洲爽爽爽| 中文精品久久久久人妻| 99久久国产综合精品网成人影院| 无码国内精品久久综合88| 国产情侣久久久久aⅴ免费| 欧美久久一区二区三区| 99久久中文字幕| 无码人妻久久一区二区三区免费 | 久久综合亚洲色HEZYO国产| 日韩精品久久久久久久电影蜜臀 | 无码AV中文字幕久久专区| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 亚洲一本综合久久| 欧美黑人又粗又大久久久| 亚洲国产成人精品女人久久久 | 国内精品久久九九国产精品| 国产A三级久久精品| 亚洲欧美日韩精品久久亚洲区 | 久久久久综合国产欧美一区二区| 精品一区二区久久| 国产精品禁18久久久夂久| 亚洲中文字幕无码久久综合网 | 国产成人精品久久一区二区三区| 久久99久久99精品免视看动漫| 久久亚洲精品无码观看不卡| 国产精品美女久久久久AV福利| 久久精品国产91久久麻豆自制 | 国产69精品久久久久9999APGF | 欧美日韩久久中文字幕| 一本色综合久久| 亚洲AV无码成人网站久久精品大|