Linux目录遍历函数
Posted fu_GAGA
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux目录遍历函数相关的知识,希望对你有一定的参考价值。
目录遍历函数
查看说明文档
man 3 opendir/readdir/closedir
1.1 opendir
函数
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
- 作用:打开一个目录
- 参数:
- name:需要打开的目录名称
- 返回值:
- DIR * 类型:理解为目录流信息
- 错误返回NULL
DESCRIPTION
Theopendir()
function opens a directory stream corresponding to the directory name, and
returns a pointer to the directory stream. The stream is positioned at the first entry in the
directory.
1.2 readdir
函数
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
- 作用:读取目录中的数据,每次都从上一次读完的末尾开始接着读
- 参数:
dirp
是通过opendir
返回的结果 - 返回值:
struct dirent
,代表读取到的文件的信息- 读取到了末尾或者失败了,返回NULL
dirent
结构体
存放文件信息
struct dirent
ino_t d_ino; // 此目录进入点的inode
off_t d_off; // 目录文件开头至此目录进入点的位移
unsigned short d_reclen; // d_name的实际长度
unsigned char d_type; // d_name所指的文件类型
char d_name[256]; // 文件名
;
1.3 closedir
函数
#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dirp);
- 作用:关闭目录
- 参数:
dirp
是opendir
的返回值
1.4 获取目录下所有普通文件数目
由于目录中可能包含目录,要统计该目录下所有普通文件,以及该目录下所有目录下的普通文件(递归)
定义递归函数 getFileNum
// 用于获取目录下所有普通文件的个数
// 递归
int getFileNum(const char * path)
// 1.打开目录
DIR * dir = opendir(path);
if(dir == NULL)
perror("opendir");
exit(0);
// exit(0)在<stdlib.h>文件中
// 2.读取
// 如果是一个目录,则再次进入该目录读取该目录下的文件,递归
struct dirent * ptr;
// 记录普通文件的个数
int total = 0;
while(( ptr = readdir(dir)) != NULL)
// 获取名称
// ./ 和 ../ 不需要操作
char * dname = ptr->d_name;
// 忽略掉./ 和 ../
if(strcmp(dname, ".") == 0 || strcmp(dname, "..") == 0)
continue;
// 判断是否是普通文件还是目录
if(ptr->d_type == DT_DIR)
// 是目录,递归读取
// 目前只得到了名字,路径需要拼接,为path/dname
char newpath[256];
sprintf(newpath, "%s/%s", path, dname);
total += getFileNum(newpath);
if(ptr->d_type == DT_REG)
total++;
// 关闭目录
closedir(dir);
return total;
使用 ptr->d_type == DT_DIR
判断文件是否是目录文件
- 遇到目录,递归调用统计其下的普通文件
- 遇到普通文件,总数+1
main
函数:
// 读取某个目录下所有普通文件的个数
int main(int argc, char *argv[])
// 命令格式 ./a.out lesson15
if(argc < 2)
printf("%s path\\n", argv[0]);
return -1;
int num = getFileNum(argv[1]);
printf("普通文件的个数为:%d\\n", num);
return 0;
编译运行
uerer@fuerer-virtual-machine:~/Linux/lesson15$ gcc readFileNum.c -o app
fuerer@fuerer-virtual-machine:~/Linux/lesson15$ ls
app readFileNum.c
fuerer@fuerer-virtual-machine:~/Linux/lesson15$ ./app
./app path
fuerer@fuerer-virtual-machine:~/Linux/lesson15$ ./app /home/fuerer/Linux/
普通文件的个数为:861
fuerer@fuerer-virtual-machine:~/Linux/lesson15$ ./app /home/fuerer/Linux/lesson15
普通文件的个数为:2
fuerer@fuerer-virtual-machine:~/Linux/lesson15$ ./app /home/fuerer/
普通文件的个数为:6702
以上是关于Linux目录遍历函数的主要内容,如果未能解决你的问题,请参考以下文章