Linux目录遍历函数

1.打开一个目录

#include <sys/types.h>

#include <dirent.h>

DIR *opendir(const char *name);

参数:

-name:需要打开的目录的名称

返回值:

DIR * 类型,理解为目录流

错误返回NULL

2.读取目录中的数据

#include <dirent.h>

struct dirent *readdir(DIR *dirp);

参数

-dirp是opendir返回的结果

返回值:

struct dirent,代表读取到的文件的信息

读取到了末尾或者失败了返回NULL

3.关闭目录

#include <sys/types.h>

#include <dirent.h>

int closedir(DIR *dirp);

cpp 复制代码
#include <sys/types.h>
#include <dirent.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <errno.h>
int getFileNum(const char* path);
int main(int argc, char * argv[]) {
    if(argc < 2) {
        printf("%s path\n", argv[0]);
        return -1;
    }
    int num = getFileNum(argv[1]);
    printf("普通文件的个数为:%d\n", num);
    return 0;
}
//用于获取目录下所有普通文件的个数
int getFileNum(const char* path) {
    //打开目录
    DIR * dir = opendir(path);
    if(dir == NULL) {
        perror("opendir");
        exit(0);
    }
    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) {
            //目录,需要继续读取这个目录
            char newpath[256];
            sprintf(newpath, "%s/%s", path, dname);
            total += getFileNum(newpath);
        }
        if(ptr->d_type == DT_REG) {
            //普通文件
            total++;
        }
    }
    //关闭目录
    closedir(dir);
    return total;
}
相关推荐
感哥9 小时前
C++ 面向对象
c++
沐怡旸11 小时前
【底层机制】std::shared_ptr解决的痛点?是什么?如何实现?如何正确用?
c++·面试
感哥17 小时前
C++ STL 常用算法
c++
用户311879455921817 小时前
Kylin Linux 10 安装 glib2-devel-2.62.5-7.ky10.x86_64.rpm 方法(附安装包)
linux
涛啊涛18 小时前
Centos7非LVM根分区容量不足后扩容,对调硬盘挂载/
linux·磁盘管理
saltymilk1 天前
C++ 模板参数推导问题小记(模板类的模板构造函数)
c++·模板元编程
感哥1 天前
C++ lambda 匿名函数
c++
沐怡旸1 天前
【底层机制】std::unique_ptr 解决的痛点?是什么?如何实现?怎么正确使用?
c++·面试
感哥1 天前
C++ 内存管理
c++
CYRUS_STUDIO2 天前
用 Frida 控制 Android 线程:kill 命令、挂起与恢复全解析
android·linux·逆向