http://www.cnblogs.com/harlanc/p/6991041.html
#define _XOPEN_SOURCE 500
#include <ftw.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
/*
http://www.cnblogs.com/harlanc/p/6991041.html
FTW_F fpath是一个普通文件。
FTW_D fpath是一个目录。
FTW_DNR fpath是一个不能被读的目录。
FTW_DP fpath是一个目录,并且 flag参数被指定为FTW_DEPTH。(如果flags没有被指定为FTW_DEPTH,
那么访问目录时使用的typeflag总会是FTW_D。)路径fpath下的所有文件和子目录已经被处理过了。
FTW_NS 在不是符号链接的fpath上调用stat失败。可能的原因是调用者对父目录有读权限,
所以文件名fpath可以被看到,但是没有执行权限,所以执行stat失败。由sb指向的缓存的内容是未定义的。
FTW_SL fpath是一个符号链接,flags被设置为FTW_PHYS。
FTW_SLN fpath是一个指向不存在的文件的符号链接。(只在FTW_PHYS未被设置的时候才会发生。)
struct FTW
{
int base;
int level;
};
*/
static int
display_info(const char *fpath, const struct stat *sb,
int tflag, struct FTW *ftwbuf)
{
printf("%-3s %2d ",
(tflag == FTW_D) ? "d" : (tflag == FTW_DNR) ? "dnr" :
(tflag == FTW_DP) ? "dp" : (tflag == FTW_F) ? "f" :
(tflag == FTW_NS) ? "ns" : (tflag == FTW_SL) ? "sl" :
(tflag == FTW_SLN) ? "sln" : "???",
ftwbuf->level);
if (tflag == FTW_NS)//链接文件
printf("-------");
else
printf("%7jd", (intmax_t) sb->st_size);
printf(" %-40s %d %s\n",
fpath, ftwbuf->base, fpath + ftwbuf->base);
return 0; /* To tell nftw() to continue */
}
int
main(int argc, char *argv[])
{
int flags = 0;
if (argc > 2 && strchr(argv[2], 'd') != NULL)
flags |= FTW_DEPTH;
if (argc > 2 && strchr(argv[2], 'p') != NULL)
flags |= FTW_PHYS;
if (nftw((argc < 2) ? "." : argv[1], display_info, 20, flags)
== -1) {
perror("nftw");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}