星期一, 5月 15, 2006

ftw - walk through the directory recursively

ftw 這個function 很有趣,他的prototype是:
 int ftw(const char *dir, int (*fn)(const char *file, const struct stat *sb, int flag), int depth)
有趣的是 一個function就可以走訪整個目錄。那對於每一個目錄中的item 要怎麼處置呢?
用call back function :
 int (*fn)(const char *file, const struct stat *sb, int flag)
walk through每一個item,都會呼叫這個function一次。
同時會傳入一些argument:
  • const char *file : item name (目錄or file name)
  • const struct stat *sb : item (目錄 or file)的stat varieble
  • int flag : item 的種類
    FTW_F : 檔案
    FTW_D : 目錄
    FTW_DNR : 不可讀取的目錄,(將不會進入)
    FTW_SL : 符號連結
    FTW_NS : 沒辦法取得stat 結構
callback function 要return 0或1。
當callback return 1時,ftw會停止walk through,返回。
(都搜尋完了也會返回)。

呼叫ftw時,第三個參數 depth是"容許使用的file handle"。
因為walk through的recursive動作需要動態alloca handle,這個argument限制alloc的最大handle數。

#include <sys/stat.h>
#include <unistd.h>
#include <ftw.h>

int getfile(const char *file, const struct stat *sb, int flag)
{
static i=0;
printf("[%d] %s",i++,file);
if ( flag == FTW_D)
printf("-- directory\n");
else
printf("\n");

return 0;
}


main()
{
ftw("/home/checko", getfile,500):
}
.

沒有留言:

網誌存檔