本篇记录在Linux环境下,文件树操作之nftw和tfw函数,说明:
nftw()遍历位于目录目录路径下的目录树,并对树中的每个条目调用fn()一次。默认情况下,目录在其包含的文件和子目录之前进行处理(按序遍历)。
为了避免用尽调用进程的所有文件描述符,nopenfd指定了nftw()同时打开的最大目录数。当搜索深度超过此值时,nftw()将变慢,因为目录必须关闭并重新打开。nftw)在目录树中的每个级别最多使用一个文件描述符。
首先查看帮助文档:
1.ntfw函数文件树遍历。
函数名 | nftw |
相关函数 | ftw |
表头文件 | #include <ftw.h> |
函数定义 | int nftw(const char *dirpath, |
函数说明 | nftw()与ftw()很像,都是从参数dir指定的目录开始, 往下一层层地递归遍历子目录。 每进入一个目录,便会调用参数*fn定义的函数来处理。nftw()会传四个参数给fn(). 第一个参数*file指向当时所在的目录路径,第二个参数是*sb, 为stat结构指针(结构定义请参考stat()),第三个参数为旗标,有底下几种可能值: |
返回值 | 成功返回0,失败返回-1 |
示例:
#define _XOPEN_SOURCE 500
#include <iostream>
#include <ftw.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
using namespace std;
static int display_info_nftw(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);
//ftwbut->base base是在fpath中给定的路径名中的文件名(basename)的偏移量
//如果不加路径偏移里,就会显示全路径名,与下面一行打印可以看出对比
printf("\t%-40s\t%d\t%s\n", fpath, ftwbuf->base, fpath + ftwbuf->base);
//printf("\t%-40s\t%d\t%s\n", fpath, ftwbuf->base, fpath);
return 0; /* To tell nftw() to continue */
}
int main()
{
int flags = 0;
char path[] = "/home/scott/Videos/mp4/";//这个是base的长度值 23
int len = strlen(path);
printf("len=======================%d\n", len);
flags |= FTW_DEPTH;
//flags |= FTW_PHYS;
if (nftw(path, display_info_nftw, 20, flags) == -1) {
perror("nftw");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
运行结果:
2.tfw函数文件树遍历。
函数名 | ftw |
相关函数 | nftw |
表头文件 | #include <ftw.h> |
函数定义 | int ftw(const char *dirpath, |
函数说明 | ftw() 是一个旧函数,它提供的功能是nftw()函数功能的一个子集。它们的区别如下: ftw() 没有flags参数。它和调用参数flags 为0的nftw()等价对于在树中发现的每个节点,ftw() 为其调用带3个参数的函数fn(),这3个参数为fpath,sb,typeflag。fpath是节点的路径名,它可以表示为相对路径或者绝对路径,相对路径是相对调用进程的当前工作目录。sb是为fpath调用stat函数所返回的指向stat结构体的指针。提供给fn() 的typeflag 参数可供选择的范围更小:只有取下面其中一个值:
|
返回值 | 成功返回0,失败返回-1 |
示例:
#define _XOPEN_SOURCE 500
#include <iostream>
#include <ftw.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
using namespace std;
static int display_info_ftw(const char *fpath, const struct stat *sb, int tflag)
{
printf("%-3s\t",
(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" : "???");
if (tflag == FTW_NS)
printf("-------");
else
printf("%7jd", (intmax_t) sb->st_size);
printf("\t%-40s\tuid=%d\tgid=%d\n", fpath, sb->st_uid, sb->st_gid);
return 0; /* To tell nftw() to continue */
}
int main()
{
char path[] = "/home/scott/Videos/photo";
//int len = strlen(path);
//printf("len=======================%d\n", len);
if (ftw(path, display_info_ftw, 20) == -1) {
perror("ftw");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
运行结果:
参考: