linux下扫描目录函数用法总结

1、scandir读取特定的目录数据

转载请保留: http://www.cnscn.org(CNS电脑与英语学习网)
相关函数:opendir, readdir, alphasort
表头文件:#include <dirent.h>
定义函数:int scandir(const char *dir, struct dirent **namelist, nt (*select) (const struct dirent *), nt (*compar) (const struct dirent , const struct dirent));
函数说明:
scandir()会扫描参数dir指定的目录文件,经由参数select指定的函数来挑选目录结构至参数namelist数组中,最后再调用参数compar指定的函数来排序namelist数组中的目录数据。
每次从目录文件中读取一个目录结构后便将此结构传给参数select所指的函数, select函数若不想要将此目录结构复制到namelist数组就返回0,若select为空指针则代表选择所有的目录结构。
scandir()会调用qsort()来排序数据,参数compar则为qsort()的参数,若是要排列目录名称字母则可使用alphasort(). 结构dirent定义请参考readdir()
返回值 :成功则返回复制到namelist数组中的数据结构数目,有错误发生则返回-1
错误代码:ENOMEM 核心内存不足

/* 读取当前目录下文件名长度大于5的目录结构 */
#include <dirent.h>

int myselect(const struct dirent *dir)
{
if(strlen(dir->d_name) > 5)
return 1;
else
return 0;
}

main()
{
struct dirent **namelist;
int i, total;

total = scandir(".", &namelist, myselect, alphasort);
if(total < 0)
      perror("scandir");
else
{
       for(i=0; i<total; i++)
             printf("%s\n", namelist->d_name);
       printf("total = %d\n", total);
}

}

2、ftw函数

相关函数:opendir

表头文件:#include<ftw.h>

定义函数:int ftw(const char *dir, int (*fn)(const char *file, const struct stat *sb, int flag), int depth);

函数说明:ftw()会从参数dir指定的目录开始,往下一层层地递归式遍历子目录。每进入一个目录,便会调用参数fn定义的函数来处理。ftw()会传三个参数给fn(),第一个参数file指向当时所在的目录路径,第二个参数是*sb,为stat结构指针(结构定义请参考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()。

范例:

/列出 /etc/X11 目录下的子目录/

#include <sys/stat.h>

#include <unistd.h>

#include <ftw.h>

int fn(const char *file, const struct stat *sb, int flag)

{

  if(flag == FTW_D) printf("%s -- directory\n", file);

  return 0;

}

int main()

{

 ftw("/etc/X11", fn, 500);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值