zoukankan      html  css  js  c++  java
  • opendir、readdir以及使用

    opendir,打开一个目录。

      函数原型:DIR *opendir(const char *name)

        DIR *fopendir(int fd)

      DIR是一个结构指针,是一个内部结构,保存所打开的目录信息。函数出错返回NULL

    readdir,读目录 ,<dirent.h>

      函数原型:struct dirent *readdir(DIR *dirp);  //返回一条记录项(文件或目录)

           int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);

    struct dirent
    {
        ino_t d_ino;    //此目录进入点的inode
        ff_t d_off;    //目录文件开头至此目录进入点的位移
        signed short int d_reclen;     //d_name 的长度,不包含NULL
        unsigned char d_type;     //d_name 所指的文件类型
        har d_name[256];     //文件名
    }

    递归获取文件个数

    #include <dirent.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    
    int getFileNum(char *root)
    {
        //open dir
        DIR* dir = NULL;
        dir = opendir(root);
        if(dir == NULL)
        {
            perror("opendir");
            exir(1);
        }
        
        //遍历当前打开的目录
        struct dirent* ptr = NULL;
        char path[1024] ={0};
        int total = 0;
        while(ptr = readdir(dir) != NULL)
        {
            //过滤. 和 ..
            if(strcmp(ptr->d_name, ".") == 0 || strcmp(ptr->d_name, "..") == 0)
            {
                continue;
            }
            if(ptr->d_type == DT_DIR)
            {
                //递归 读目录
                sprintf(path, "%s/%s", root, ptr->d_name);
                total += getFileNum(path);
            }
            //如果是普通文件
            if(ptr->d_type == DT_REG)
            {
                total++;
            }
        }
        //还需要关闭目录
        closedir(dir);
        return total;
    }
    
    int main(int argc, char *argv[])
    {
        if(argc < 2)
        {
            printf("./a.out dir
    ");
            exit(1);
        }
    
        int total = getFileNum(argv[1]);
        printf("%s has file numbers %d
    ", argv[1], total);
        return 0;
    }
  • 相关阅读:
    NO6 alias-unalias命令,递归创建目录,如何取消覆盖提示
    NO4 find&mv-&-特殊符号..和.
    NO5 grep-head-tail命令
    linux面试题:删除一个目录下的所有文件,但保留一个指定文件
    NO3 cat-xargs-cp-mv-rm-find命令
    Linux 快速删除已输入的命令
    NO2 pwd-touch-vim-vi-echo-重定向等命令
    NO1 ip-systemctl-fdisk
    SecureCRT:保存输出日志的方法
    WMware workstation 镜像文件
  • 原文地址:https://www.cnblogs.com/lr1402585172/p/10490412.html
Copyright © 2011-2022 走看看