遍历目录 nftw and ftw

本文介绍了ftw和nftw两个用于遍历目录树的函数,详细解释了它们的工作原理、参数及返回值的意义,并对比了两者的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

·       ftw()

相关函数:opendir
表头文件:#include <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结构指针,第三个参数为旗标,有下面几种可能值
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()

 

 

nftw遍历目录树


表头文件:#include  <ftw.h>
定义函数:int nftw(const char *dir, int  (*fn)(const char *file, const struct stat *sb, int flag, struct FTW *s),
               depth, int  flags)
函数说明:nftw()ftw()很像,都是从参数dir指定的目录开始,往下一层层地递归遍历子目录。每进入一个目录,便会调用参数*fn定义的函数来处理。nftw()会传四个参数给fn(). 第一个参数*file指向当时所在的目录路径,第二个参数是*sb, stat结构指针(结构定义请参考stat()),第三个参数为旗标,有底下几种可能值:
FTW_F                        
一般文件
FTW_D                        
目录
FTW_DNR                     
不可读取的目录。此目录以下将不被遍历
FTW_SL                        
符号连接
FTW_NS                        
无法取得stat结构数据,在可能是权限问题
FTW_DP                        
目录,而且子目录都已被遍历过了
FTW_SLN                       
符号连接,但连接不存在的文件

fn()
的第四个参数是FTW结构,定义如下:

struct  FTW
{
     int  base;
     int  level; //level
代表遍历时的深度
}

nftw()
第三个参数depth代表nftw()在进行遍历目录时可同时打开的文件数。
ftw()
在遍历时每一层目录至少需要一个文件描述词,如果遍历时用完了depth所给予的限制数目,整个遍历将因不断地关文件和开文件操作而显得的缓慢

nftw()
最后一个参数flags用来指定遍历时的动作,可指定下列的操作或用OR组合
FTW_CHDIR                 
在读目录之前先用chdir()移到此目录
FTW_DEPTH               
执行深度优先搜索。在遍历此目录前先将所有子目录遍历完
FTW_MOUNT               
遍历时不要跨越到其他文件系统
FTW_PHYS                  
不要遍历符号连接的目录。预设会遍历符号连接目录

如果要结束nftw()的遍历,fn()只需返回一非0值即可,此值同时也会是nftw()的返回值。否则nftw()会试着遍历完所有目录,然后返回0

:遍历中断则返回fn()函数的返回值,全部遍历完则返回0,若有错误发生则返回-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值