2011年11月13日 星期日

搜尋路徑下的所有的 directory 和 file --- ftw

【轉貼】成長每一天

headfileftw.h 
定義:int  ftw(const char *dir, int (*fn) (const *file, const struct stat *sb, int flag), int depth)
說明:ftw() 會從參數dir指定的目錄開始,往下一層層地遞回所有的目錄。
ftw()會傳三個參數給fn(),
  • 第一個參數 *file指向當時所在的目錄路徑
  • 第二個參數是 *sbstat結構
  • 第三個參數為flag,有下面幾種:
                FTW_F        一般文件
                FTW_D       目錄
                FTW_DNR   不可讀取的目錄,此目錄以下將不被遍歷
                FTW_SL      符號連接
                FTW_NS      無法取得stat結構,有可能是權限問題

最後一個depth代表ftw()在進行遍歷目錄同時打開的文件數。ftw()在遍歷每一層目錄至少需要一個文件描述詞,如果遍歷時用完了depth所給予的限制數目,整個遍歷因不斷地關文件和開文件操作而變得緩慢。
如果要結束ftw()的遍歷,fn()只需返回一非零值即可,此值同時也會是ftw()的返回值。否則ftw()會試著走完所有的目錄,然後返回0

返回值:遍歷中斷返回fn()函數的返回值,全部遍歷返回0,若有錯誤發生則返回-1
附加說明:由于ftw()會動態配置內存,請使用正常方式(fn函數返回非零值)來中斷遍歷,不要在fn函數中使用longjmp().


ref: 成長每一天




#include <ftw.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>

char *test[512];

int list(const char *path, const struct stat *status, int type)
{
    char *key="brightness";
    static int i=0;

    if (strstr(path, key)!=NULL)
    {
        test[i] = (char *)malloc(strlen(path)+1); //不知會不會有memory fragment的問題@@
        strcpy(test[i],path);
        i++;
    }
    return 0;
}

int main(int argc, char *argv[])
{
    ftw("/sys/class/backlight/", list, FTW_F);
    int i=0;

    for(i=0;test[i] != NULL;i++)    
    {
        printf("test=%s\n", test[i]);
        free(test[i]);

    }

    //free(*test); <-沒有free乾淨 (用memory 泄露工具檢查)
    return 0;
}
執行結果:
test=/sys/class/backlight/acpi_video0/brightness
test=/sys/class/backlight/acpi_video0/actual_brightness
test=/sys/class/backlight/acpi_video0/max_brightness

沒有留言:

張貼留言