Linux目录遍历函数

Posted 傅耳耳

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
The opendir() 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);
  • 作用:关闭目录
  • 参数:dirpopendir 的返回值

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目录遍历函数的主要内容,如果未能解决你的问题,请参考以下文章

Linux目录遍历函数

Linux目录遍历函数

Linux C中文函数手册之 目录操作函数

替换空格

linux 系统内置命令

Linux和Windows的遍历目录下所有文件的方法对比