C++遍历文件夹下所有文件

来源:互联网 发布:青年网络公开课 优酷 编辑:程序博客网 时间:2024/06/14 13:32

早上吃饭时同学问我怎么读若干个同样格式的文件,我说把文件名都改成有规律的比如1.txt,2.txt,3.txt……然后修改string,他又问我怎么修改,想起解释起来也比较麻烦,而且这方法其实不是很好(因为要手动修改文件名)所以复习下遍历文件夹的知识。

其实我还是比较常用MFC的所以直接用WIN32_FIND_DATA结构体,对应宽字节的为WIN32_FIND_DATAW。才发现控制台下可以用MFC类库于是直接写控制台程序了,在VS2012下勾选添加公共头文件以用于MFC即可。



#include <string>#include <vector>#include <cstring>#include <algorithm>//中间为自动生成代码//main函数内//遍历文件夹WIN32_FIND_DATAA data;string strPathFileFolder("F:\\测试");   //文件夹路径string curr = strPathFileFolder + "\\*.*";vector<string> vFileName;  //文件夹下文件名//找到文件夹起始句柄HANDLE hError = ::FindFirstFileA(curr.c_str(), &data);if (hError == INVALID_HANDLE_VALUE){cout << "找不到该目录" << endl;return 1;}//不断寻找下一个文件名直到文件末尾,并将路径存入vFileNamewhile (::FindNextFileA(hError, &data)){//过滤.和..if (strcmp(data.cFileName, ".") == 0|| strcmp(data.cFileName, "..") == 0){continue;}vFileName.push_back(string(data.cFileName));}//输出文件名for_each(vFileName.begin(), vFileName.end(),[](string strPath){ cout << strPath << endl; });


可以发现文件夹名也遍历到了

如果要进一步遍历的话只需要判断是否有后缀了。假如要筛选出.rar文件只需要添加后缀判断代码。

但是可以发现这里很多文件名中已经包含了'.'所以如果直接find'.'会出问题

//把原来的vFileName.push_back("")改成以下代码//筛选.rar文件string str(data.cFileName);auto iter = find(str.begin(), str.end(), '.');if (iter != str.end()){while (true){//寻找下一个.的位置iter2auto iter2 = iter + 1;iter2 = find(iter2, str.end(), '.');//iter2到达str.end()时iter即最后一个.的位置if (iter2 == str.end())  {if (string(iter, str.end()) == ".rar"){vFileName.push_back(str);}break;}iter = iter2;}}


到这一步遍历文件夹的操作就回顾完毕了,查找文件夹名只需要判断if (iter == str.end())即可。


不过发现其实不用MFC类库也可以遍历文件夹,利用<io.h>下的_finddata_t结构体,方法差不多。

#include <io.h>#include <iostream>#include <string>#include <cstring>#include <vector>#include <algorithm>using namespace std;int main(){_finddata_t data;string strFileFolder = "F:\\测试";string curr = strFileFolder + "\\*.*";vector<string> vFileName;//查找文件夹第一个文件句柄int handle = _findfirst(curr.c_str(), &data);if (handle == -1){cout << "找不到该目录" << endl;return 1;}while (!_findnext(handle, &data)){//过滤..if (strcmp(data.name, "..")){vFileName.push_back(string(data.name));}}//输出该文件夹下所有文件名for_each(vFileName.begin(), vFileName.end(),[](string& str){ cout << str << endl; });return 0;}


0 0