• C++读取文件夹中所有的文件或者是特定后缀的文件


    由于经常有读取一个文件夹中的很多随机编号的文件,很多时候需要读取某些特定格式的所有文件。

    下面的代码可以读取指定文件家中的所有文件和文件夹中格式为jpg的文件

    参考:

    http://www.2cto.com/kf/201407/316515.html

    http://bbs.csdn.net/topics/390124159

    解决Win10下_findnext()异常

    在win10中,使用文件遍历函数_findnext会报0xC0000005错误
    原因:
    _findnext()第一个参数”路径句柄”,返回的类型为intptr_t(long long),如果定义为long,在win7中是没有问题,但是在win10中就要改为long long或者intptr_t

    情形1: 读取一个文件夹中的所有目录

    /*************************************************************
    windows遍历文件目录以及子目录 所有的文件 总结
    2018.2.27
    *************************************************************/
    
    #include <io.h>
    #include <string>
    #include <fstream>
    #include <string>
    #include <vector>
    #include <iostream>
    #include <direct.h>  
    #include <opencv2/opencv.hpp>
    #include <opencv2/opencv_lib.h>
    using namespace std;
    using namespace cv;
    
    /*************************************************************
    方法4 先找出所有的目录和子目录,之后遍历各个目录文件
    *************************************************************/
    vector<string> folder;
    void findAllSubDir(string  srcpath)
    {
        //cout << "父目录  " << srcpath << endl;
        _finddata_t file;
        long lf;
        string pathName, exdName;
        //修改这里选择路径和要查找的文件类型  
        if ((lf = _findfirst(pathName.assign(srcpath).append("\*").c_str(), &file)) == -1l)
            //_findfirst返回的是long型;long __cdecl _findfirst(const char *, struct _finddata_t *)  
            cout << "文件没有找到!
    ";
        else
        {
            //cout << "
    文件列表:
    ";
            do {
                string  curpath = file.name;
                if (curpath != "." && curpath != "..")
                {
                    if (file.attrib == _A_NORMAL)cout << "  普通文件  ";
                    else if (file.attrib == _A_RDONLY)cout << "  只读文件  ";
                    else if (file.attrib == _A_HIDDEN)cout << "  隐藏文件  ";
                    else if (file.attrib == _A_SYSTEM)cout << "  系统文件  ";
                    else if (file.attrib == _A_SUBDIR)
                    {
                        cout << "  子目录  ";
                        curpath = srcpath + "\" + curpath;
                        cout << curpath << endl;
                        folder.push_back(curpath);
                        //变量子目录
                        //cout << "         ";
                        findAllSubDir(curpath);
                    }
                    else
                        ;//cout << "  存档文件  ";
                    //cout << endl;
                }
            } while (_findnext(lf, &file) == 0);
            //int __cdecl _findnext(long, struct _finddata_t *);如果找到下个文件的名字成功的话就返回0,否则返回-1  
        }
        _findclose(lf);
    }
    
    int main()
    {
        //要遍历的目录
        string path = "parent";
        findAllSubDir(path);
        vector<string> files = folder;
        int size = files.size();
        //     for (int i = 0; i < size; i++)
        //     {
        //         cout << files[i] << endl;
        //     }
        system("pause");
        return 0;
    }
    View Code

    情形2: 读取一个文件夹中的所有文件

    更新2017.7.28

      1 /*************************************************************
      2 windows遍历文件目录以及子目录 所有的文件 总结
      3 2017.7.28
      4 *************************************************************/
      5 
      6 #include <io.h>
      7 #include <string>
      8 #include <fstream>
      9 #include <string>
     10 #include <vector>
     11 using namespace std;
     12 
     13 /*************************************************************
     14 方法1 不能遍历子目录
     15 *************************************************************/
     16 //获取所有的文件名
     17 void GetAllFiles(string path, vector<string>& files)
     18 {
     19     long hFile = 0;
     20     //文件信息
     21     struct _finddata_t fileinfo;
     22     string p;
     23     if ((hFile = _findfirst(p.assign(path).append("\*").c_str(), &fileinfo)) != -1)
     24     {
     25         do
     26         {
     27             if ((fileinfo.attrib & _A_SUBDIR))
     28             {
     29                 if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
     30                 {
     31                     files.push_back(p.assign(path).append("\").append(fileinfo.name));
     32                     GetAllFiles(p.assign(path).append("\").append(fileinfo.name), files);
     33                 }
     34             }
     35             else
     36             {
     37                 files.push_back(p.assign(path).append("\").append(fileinfo.name));
     38             }
     39         } while (_findnext(hFile, &fileinfo) == 0);
     40         _findclose(hFile);
     41     }
     42 }
     43 
     44 //获取特定格式的文件名
     45 void GetAllFormatFiles(string path, vector<string>& files, string format)
     46 {
     47     //文件句柄
     48     long hFile = 0;
     49     //文件信息
     50     struct _finddata_t fileinfo;
     51     string p;
     52     if ((hFile = _findfirst(p.assign(path).append("\*" + format).c_str(), &fileinfo)) != -1)
     53     {
     54         do
     55         {
     56             if ((fileinfo.attrib & _A_SUBDIR))
     57             {
     58                 if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
     59                 {
     60                     //files.push_back(p.assign(path).append("\").append(fileinfo.name) );
     61                     GetAllFormatFiles(p.assign(path).append("\").append(fileinfo.name), files, format);
     62                 }
     63 
     64             }
     65             else
     66             {
     67                 files.push_back(p.assign(path).append("\").append(fileinfo.name));
     68             }
     69         } while (_findnext(hFile, &fileinfo) == 0);
     70         _findclose(hFile);
     71     }
     72 }
     73 
     74 // 该函数有两个参数,第一个为路径字符串(string类型,最好为绝对路径);
     75 // 第二个参数为文件夹与文件名称存储变量(vector类型,引用传递)。
     76 // 在主函数中调用格式(并将结果保存在文件"AllFiles.txt"中,第一行为总数):
     77 int readfile(string filePath)
     78 {
     79     //string filePath = "testimages\water";
     80     vector<string> files;
     81     char * distAll = "AllFiles.txt";
     82     //读取所有的文件,包括子文件的文件
     83     //GetAllFiles(filePath, files);
     84     //读取所有格式为jpg的文件
     85     string format = ".txt";
     86     GetAllFormatFiles(filePath, files, format);
     87     ofstream ofn(distAll);
     88     int size = files.size();
     89     ofn << size << endl;
     90     for (int i = 0; i < size; i++)
     91     {
     92         ofn << files[i] << endl;
     93         cout << files[i] << endl;
     94     }
     95     ofn.close();
     96     return 0;
     97 }
     98 
     99 /*************************************************************
    100 方法2 不能遍历子目录
    101 *************************************************************/
    102 void readfile1()
    103 {
    104     _finddata_t file;
    105     long lf;
    106     //修改这里选择路径和要查找的文件类型  
    107     if ((lf = _findfirst("D:\project\dualcamera\TestImage\FileTest\c1\s1\*.txt*", &file)) == -1l)
    108         //_findfirst返回的是long型;long __cdecl _findfirst(const char *, struct _finddata_t *)  
    109         cout << "文件没有找到!
    ";
    110     else
    111     {
    112         cout << "
    文件列表:
    ";
    113         do {
    114             cout << file.name;
    115             if (file.attrib == _A_NORMAL)cout << "  普通文件  ";
    116             else if (file.attrib == _A_RDONLY)cout << "  只读文件  ";
    117             else if (file.attrib == _A_HIDDEN)cout << "  隐藏文件  ";
    118             else if (file.attrib == _A_SYSTEM)cout << "  系统文件  ";
    119             else if (file.attrib == _A_SUBDIR)cout << "  子目录  ";
    120             else cout << "  存档文件  ";
    121             cout << endl;
    122         } while (_findnext(lf, &file) == 0);
    123         //int __cdecl _findnext(long, struct _finddata_t *);如果找到下个文件的名字成功的话就返回0,否则返回-1  
    124     }
    125     _findclose(lf);
    126 }
    127 
    128 
    129 /*************************************************************
    130 方法3 可以遍历子目录
    131 *************************************************************/
    132 void dir(string path)
    133 {
    134     long hFile = 0;
    135     struct _finddata_t fileInfo;
    136     string pathName, exdName;
    137     // \* 代表要遍历所有的类型
    138     if ((hFile = _findfirst(pathName.assign(path).append("\*").c_str(), &fileInfo)) == -1) 
    139     {
    140         return;
    141     }
    142     do
    143     {
    144         //判断文件的属性是文件夹还是文件
    145         string  curpath = fileInfo.name;
    146         if (curpath != "." && curpath != "..")
    147         {
    148             curpath = path + "\" + curpath;
    149             //变量文件夹中的png文件
    150             if (fileInfo.attrib&_A_SUBDIR)
    151             {
    152                 //showfile(curpath);
    153                 dir(curpath);
    154             }
    155             else
    156             {
    157                 cout << curpath << endl;
    158             }
    159         }
    160         //cout << fileInfo.name << (fileInfo.attrib&_A_SUBDIR ? "[folder]" : "[file]") << endl;
    161     } while (_findnext(hFile, &fileInfo) == 0);
    162     _findclose(hFile);
    163     return;
    164 }
    165 
    166 
    167 /*************************************************************
    168 方法4 先找出所有的目录和子目录,之后遍历各个目录文件
    169 *************************************************************/
    170 vector<string> folder;
    171 void dir(string path)
    172 {
    173     long hFile = 0;
    174     struct _finddata_t fileInfo;
    175     string pathName, exdName;
    176     //* 代表要遍历所有的类型
    177     if ((hFile = _findfirst(pathName.assign(path).append("\*").c_str(), &fileInfo)) == -1) {
    178         return;
    179     }
    180     do
    181     {
    182         //判断文件的属性是文件夹还是文件
    183         string  curpath = fileInfo.name;
    184         if (curpath != "." && curpath != "..")
    185         {
    186             curpath = path + "\" + curpath;
    187             //变量文件夹中的png文件
    188             if (fileInfo.attrib&_A_SUBDIR)
    189             {
    190                 //当前文件是目录
    191                 dir(curpath);
    192                 cout << curpath << endl;
    193             }
    194             else
    195             {
    196                 //进入某个子目录了
    197                 cout << curpath << endl;
    198             }
    199         }
    200         //cout << fileInfo.name << (fileInfo.attrib&_A_SUBDIR ? "[folder]" : "[file]") << endl;
    201     } while (_findnext(hFile, &fileInfo) == 0);
    202     _findclose(hFile);
    203     return;
    204 }
    205 
    206 void findAllSubDir(string  srcpath)
    207 {
    208     _finddata_t file;
    209     long lf;
    210     string pathName, exdName;
    211     //修改这里选择路径和要查找的文件类型  
    212     if ((lf = _findfirst(pathName.assign(srcpath).append("\*").c_str(), &file)) == -1l)
    213         //_findfirst返回的是long型;long __cdecl _findfirst(const char *, struct _finddata_t *)  
    214         cout << "文件没有找到!
    ";
    215     else
    216     {
    217         //cout << "
    文件列表:
    ";
    218         do {
    219             string  curpath = file.name;
    220             if (curpath != "." && curpath != "..")
    221             {
    222                 if (file.attrib == _A_NORMAL)cout << "  普通文件  ";
    223                 else if (file.attrib == _A_RDONLY)cout << "  只读文件  ";
    224                 else if (file.attrib == _A_HIDDEN)cout << "  隐藏文件  ";
    225                 else if (file.attrib == _A_SYSTEM)cout << "  系统文件  ";
    226                 else if (file.attrib == _A_SUBDIR)
    227                 {
    228                     cout << "  子目录  ";
    229                     curpath = srcpath + "\" + curpath;
    230                     cout << curpath << endl;
    231                     folder.push_back(curpath);
    232                     //变量子目录
    233                     findAllSubDir(curpath);
    234                 }
    235                 else
    236                     ;//cout << "  存档文件  ";
    237                 //cout << endl;
    238             }
    239         } while (_findnext(lf, &file) == 0);
    240         //int __cdecl _findnext(long, struct _finddata_t *);如果找到下个文件的名字成功的话就返回0,否则返回-1  
    241     }
    242     _findclose(lf);
    243 }
    244 
    245 int main()
    246 {
    247     //要遍历的目录
    248     string path = "FileTest";
    249     //dir(path);
    250     findAllSubDir(path);
    251     vector<string> files = folder;
    252     //char * distAll = "AllFiles.txt";
    253     //ofstream ofn(distAll);
    254     int size = files.size();
    255     //ofn << size << endl;
    256     for (int i = 0; i < size; i++)
    257     {
    258         //ofn << files[i] << endl;
    259         cout << files[i] << endl;
    260         readfile(files[i]);
    261     }
    262     system("pause");
    263     return 0;
    264 }
    //windows 获取某个目录下的所有文件的文件名
    #include <io.h>
    #include <fstream>
    #include <string>
    #include <vector>
    using namespace std;

    //获取所有的文件名
    void GetAllFiles( string path, vector<string>& files)
    {
        long hFile = 0;
        //文件信息
        struct _finddata_t fileinfo;
        string p;
        if((hFile = _findfirst(p.assign(path).append("\*").c_str(),&fileinfo)) != -1)
        {
            do
            {
                if((fileinfo.attrib & _A_SUBDIR))
                {
                    if(strcmp(fileinfo.name,".") != 0 && strcmp(fileinfo.name,"..") != 0)
                    {
                        files.push_back(p.assign(path).append("\").append(fileinfo.name) );
                        GetAllFiles( p.assign(path).append("\").append(fileinfo.name), files );
                    }
                }
                else
                {
                    files.push_back(p.assign(path).append("\").append(fileinfo.name) );
                }
            }while(_findnext(hFile, &fileinfo) == 0);
            _findclose(hFile);
        }
    }

     

    //获取特定格式的文件名
    void GetAllFormatFiles( string path, vector<string>& files,string format)
    {
        //文件句柄
        long hFile = 0;
        //文件信息
        struct _finddata_t fileinfo;
        string p;
        if((hFile = _findfirst(p.assign(path).append("\*" + format).c_str(),&fileinfo)) != -1)
        {
            do
            {
                if((fileinfo.attrib & _A_SUBDIR))
                {
                    if(strcmp(fileinfo.name,".") != 0 && strcmp(fileinfo.name,"..") != 0)
                    {
                        //files.push_back(p.assign(path).append("\").append(fileinfo.name) );
                        GetAllFormatFiles( p.assign(path).append("\").append(fileinfo.name), files,format);
                    }

                }
                else
                {
                    files.push_back(p.assign(path).append("\").append(fileinfo.name) );
                }
            }while(_findnext(hFile, &fileinfo) == 0);
           _findclose(hFile);
        }
    }

    // 该函数有两个参数,第一个为路径字符串(string类型,最好为绝对路径);
    // 第二个参数为文件夹与文件名称存储变量(vector类型,引用传递)。
    // 在主函数中调用格式(并将结果保存在文件"AllFiles.txt"中,第一行为总数):
    int main()
    {
        string filePath = "testimages\water";
        vector<string> files;
        char * distAll = "AllFiles.txt";
        //读取所有的文件,包括子文件的文件
        //GetAllFiles(filePath, files);
        //读取所有格式为jpg的文件
        string format = ".jpg";
        GetAllFormatFiles(filePath, files,format);
        ofstream ofn(distAll);
        int size = files.size();
        ofn<<size<<endl;
        for (int i = 0;i<size;i++)
        {
            ofn<<files[i]<<endl;
            cout<< files[i] << endl;
        }
        ofn.close();
        return 0;
    }
    //LINUX/UNIX c获取某个目录下的所有文件的文件名
      
    #include <stdio.h>
    #include <dirent.h>
    void main(int argc, char * argv[])
    {
        char ch,infile[50],outfile[50];
        struct dirent *ptr;    
         DIR *dir;
        dir=opendir("./one");
        while((ptr=readdir(dir))!=NULL)
        {
      
        //跳过'.'和'..'两个目录
            if(ptr->d_name[0] == '.')
                continue;
            printf("%s is ready...
    ",ptr->d_name);
            sprintf(infile,"./one/%s",ptr->d_name);
          
         printf("<%s>
    ",infile); 
        }
        closedir(dir);
    }



    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <dirent.h>
    #include <unistd.h>
    #include <vector>
    #include <string>
    #include <iostream>
    using namespace std;

    
    


    int readFileList(char *basePath, vector<string> &filelist)
    {
    DIR *dir;
    struct dirent *ptr;
    char base[1000];

    
    

    if ((dir=opendir(basePath)) == NULL)
    {
    perror("Open dir error...");
    exit(1);
    }

    
    

    while ((ptr=readdir(dir)) != NULL)
    {
    if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0) ///current dir OR parrent dir
    continue;
    else if(ptr->d_type == 8) ///file
    {
    printf("d_name:%s/%s ",basePath,ptr->d_name);
    string filestr = basePath;
    filestr = filestr + "/" + ptr->d_name;
    filelist.push_back(filestr);
    }
    else if(ptr->d_type == 10) ///link file
    printf("d_name:%s/%s ",basePath,ptr->d_name);
    else if(ptr->d_type == 4) ///dir
    {
    memset(base,'',sizeof(base));
    strcpy(base,basePath);
    strcat(base,"/");
    strcat(base,ptr->d_name);
    readFileList(base, filelist);
    }
    }
    closedir(dir);
    return 1;
    }

    
    

    int main(void)
    {
    DIR *dir;
    char *basePath = "./test";
    printf("the current dir is : %s ",basePath);
    vector<string> filelist;
    readFileList(basePath, filelist);
    for(int i =0; i < filelist.size(); ++i)
    {
    cout << filelist[i] << endl;
    }
    return 0;
    }





    //删除指定的文件类型
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <dirent.h>
    #include <unistd.h>
    #include <string>
    #include <iostream>
    using namespace std;

    int readFileList(char *basePath, string fileext)
    {
        DIR *dir;
        struct dirent *ptr;
        char base[1000];

        if ((dir=opendir(basePath)) == NULL)
        {
            perror("Open dir error...");
            exit(1);
        }

        while ((ptr=readdir(dir)) != NULL)
        {
            if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0)    ///current dir OR parrent dir
                continue;
            else if(ptr->d_type == 8)    ///file
            {
                //printf("d_name:%s/%s ",basePath,ptr->d_name);
                string temp = ptr->d_name;
                cout  << temp << endl;
                string sub = temp.substr(temp.length() - 4, temp.length()-1);
                cout  << sub << endl;
                if(sub == fileext)
                {
                    string path = basePath;
                    path += "/";
                    path += ptr->d_name;
                    int state = remove(path.c_str());
                }
            }
            else if(ptr->d_type == 10)    ///link file
            {
                printf("d_name:%s/%s ",basePath,ptr->d_name);
            }
            else if(ptr->d_type == 4)    ///dir
            {
                memset(base,'',sizeof(base));
                strcpy(base,basePath);
                strcat(base,"/");
                strcat(base,ptr->d_name);
                readFileList(base);
            }
        }
        closedir(dir);
        return 1;
    }

    int main(void)
    {
        DIR *dir;
        char *basePath = "../dlib-android-app";
        printf("the current dir is : %s ",basePath);
        string fileext = ".txt"
        readFileList(basePath, fileext);
        return 0;
    }


    //读取文件到一个vector中,并复制到另外一个文件夹

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <dirent.h>
    #include <unistd.h>
    #include <sys/types.h>  
    #include <sys/stat.h> using namespace std; #define dmax(a,b) (((a) > (b)) ? (a) : (b)) #define dmin(a,b) (((a) < (b)) ? (a) : (b)) //获取特定格式的文件名 int readFileList(std::vector<string> &filelist, const char *basePath, string format) { DIR *dir; struct dirent *ptr; char base[1000]; if ((dir=opendir(basePath)) == NULL) { perror("Open dir error..."); exit(1); } while ((ptr=readdir(dir)) != NULL) { if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0) ///current dir OR parrent dir continue; else if(ptr->d_type == 8) //file { //printf("d_name:%s/%s ",basePath,ptr->d_name); string temp = ptr->d_name; //cout << temp << endl; string sub = temp.substr(temp.length() - 4, temp.length()-1); //cout << sub << endl; if(sub == format) { string path = basePath; path += "/"; path += ptr->d_name; filelist.push_back(path); } } else if(ptr->d_type == 10) ///link file { //printf("d_name:%s/%s ",basePath,ptr->d_name); } else if(ptr->d_type == 4) ///dir { memset(base,'',sizeof(base)); strcpy(base,basePath); strcat(base,"/"); strcat(base,ptr->d_name); readFileList(filelist, base, format); } } closedir(dir); return 1; } void findDir(string src, string &dst, string filePath) { int begin = src.find(filePath) + filePath.size() + 1; int end = 0; for (int i = src.size() - 1; i >= 0; --i) { //cout << src[i] << endl; if (src[i] == '/') { end = i - 1; break; } } //cout << begin << endl; //cout << end << endl; dst = src.substr(begin, end - begin + 1); } int main() { // Loop over all the images provided on the command line. std::vector<string> files; string filePath = "./lfw_small_raw"; string format = ".jpg"; printf("the current dir is : %s ", filePath.c_str()); readFileList(files, filePath.c_str(), format); string alignpath = "./lfw_small_align"; for (int i = 0; i < files.size(); ++i) { /* code */ cout << files[i] << endl; string name; findDir(files[i], name, filePath); cout << name << endl;
         //判断目录是否存在,并创建新目录
            string newname = alignpath + "/" + name;
            if (access(newname.c_str(), 0) == -1)  
            {
                int flag=mkdir(newname.c_str(), 0777);  
            } } }
  • 相关阅读:
    bzoj 4974 [Lydsy1708月赛]字符串大师 KMP 最小循环元 构造
    4.10 省选模拟赛 约数 数论 转换 三元组个数
    loj #6039 「雅礼集训 2017 Day5」珠宝 分组背包 决策单调性优化
    CF R 632 div2 1333F Kate and imperfection
    CF R 632 div2 1333D Challenges in school №41
    luogu P3703 [SDOI2017]树点涂色
    3.28 省选模拟赛 染色 LCT+线段树
    luogu P3279 [SCOI2013]密码
    4.8 省选模拟赛 相遇 求树上两路径交
    Hyper-V 2016 上安装windows7激活重启后黑屏无法进入系统
  • 原文地址:https://www.cnblogs.com/adong7639/p/3983359.html
Copyright © 2020-2023  润新知