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 << "文件没有找到!\n";
    else
    {
        //cout << "\n文件列表:\n";
        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 << "文件没有找到!\n";
110     else
111     {
112         cout << "\n文件列表:\n";
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 << "文件没有找到!\n";
215     else
216     {
217         //cout << "\n文件列表:\n";
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...\n",ptr->d_name);
        sprintf(infile,"./one/%s",ptr->d_name);
      
     printf("<%s>\n",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\n",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\n",basePath,ptr->d_name);
else if(ptr->d_type == 4) ///dir
{
memset(base,'\0',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\n",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\n",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\n",basePath,ptr->d_name);
        }
        else if(ptr->d_type == 4)    ///dir
        {
            memset(base,'\0',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\n",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\n",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\n",basePath,ptr->d_name); } else if(ptr->d_type == 4) ///dir { memset(base,'\0',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\n", 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);  
        } } }

 

posted on 2014-09-20 15:48  Maddock  阅读(8460)  评论(0编辑  收藏  举报

导航