【轉貼】成長每一天
headfile:ftw.h
定義:int ftw(const char *dir, int (*fn) (const *file, const struct stat *sb, int flag), int depth)
說明:ftw() 會從參數dir指定的目錄開始,往下一層層地遞回所有的目錄。
ftw()會傳三個參數給fn(),
- 第一個參數 *file指向當時所在的目錄路徑
- 第二個參數是 *sb為stat結構
- 第三個參數為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: 成長每一天
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
沒有留言:
張貼留言