• C 遍历目录及其子目录


    遍历某一目录,获取该目录下所有文件路径的数组

     1 #include <iostream>
     2 #include <dirent.h>
     3 #include <vector>
     4 
     5 void listDir(char *path, std::vector<std::string> *files)
     6 {
     7     DIR *directory_pointer;
     8     struct dirent *entry;
     9     char childpath[512];  //定义一个字符数组,用来存放读取的路径
    10     char filepath[512];  //定义一个字符数组,用来存放读取的路径
    11     directory_pointer=opendir(path);
    12     memset(childpath,0,sizeof(childpath)); //将字符数组childpath的数组元素全部置零
    13     while((entry=readdir(directory_pointer))!=NULL)  //读取pDir打开的目录,并赋值给ent, 同时判断是否目录为空,不为空则执行循环体
    14     {
    15         if(entry->d_type & DT_DIR)  //读取 打开目录的文件类型 并与 DT_DIR进行位与运算操作,即如果读取的d_type类型为DT_DIR (=4 表读取的为目录)
    16         {
    17             if(strcmp(entry->d_name,".")==0 || strcmp(entry->d_name,"..")==0)
    18             {
    19                 //如果读取的d_name为 . 或者.. 表示读取的是当前目录符和上一目录符, 用contiue跳过,不进行下面的输出
    20                 continue;
    21             }
    22             
    23             sprintf(childpath,"%s/%s",path,entry->d_name);  //如果非. ..则将 路径 和 文件名d_name 付给childpath, 并在下一行prinf输出
    24             //printf("path:%s
    ",childpath);
    25             listDir(childpath, files);  //递归读取下层的字目录内容, 因为是递归,所以从外往里逐次输出所有目录(路径+目录名),
    26             //然后才在else中由内往外逐次输出所有文件名
    27         }
    28         else  //如果读取的d_type类型不是 DT_DIR, 即读取的不是目录,而是文件,则直接输出 d_name, 即输出文件名
    29         {
    30             sprintf(filepath,"%s/%s",path,entry->d_name);
    31             printf("file path:%s
    ",filepath); //输出文件名 带上了目录
    32             files->push_back(filepath);
    33         }
    34     }
    35 }
    36 
    37 int main(int argc, const char * argv[]) {
    38     // insert code here...
    39     std::cout << "ListFile Start!
    ";
    40     
    41     std::string res = "res";
    42     char *path = const_cast<char *>(res.c_str());
    43     std::vector<std::string> files;
    44     listDir(path, &files);
    45     return 0;
    46 }

    运行结果:

  • 相关阅读:
    Knockout.Js官网学习(visible绑定)
    Entity Framework 简单增删改操作
    Knockout.Js官网学习(数组observable)
    Knockout.Js官网学习(监控属性Observables)
    Entity Framework 简单查询
    Java 使用getClass().getResourceAsStream()方法获取资源
    Virtualbox [The headers for the current running kernel were not found] (操作过程后还是失败,显示相同问题)
    为什么要在linux命令前加上 ./
    Redis need tcl 8.5 or newer
    JDK和Tomcat部署时,版本不同的问题解决
  • 原文地址:https://www.cnblogs.com/ring1992/p/11865579.html
Copyright © 2020-2023  润新知