Windows遍历文件夹
先用_getcwd函数得到当前文件所在的目录
然后获取目录下的文件
_finddata_t结构体
struct _finddata_t
{
unsigned attrib;
time_t time_create;
time_t time_access;
time_t time_write;
_fsize_t size;
char name[_MAX_FNAME];
};
unsigned atrrib:文件属性的存储位置。它存储一个unsigned单元,用于表示文件的属性。文件属性是用位表示的,主要有以下一些:_A_ARCH(存档)、 _A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。这些都是在中定义的宏,可以直接使用,而本身的意义其实是一个无符号整型(只不过这个整型应该是2的几次幂,从而保证只有一位为 1,而其他位为0)。既然是位表示,那么当一个文件有多个属性时,它往往是通过位或的方式,来得到几个属性的综合。例如只读+隐藏+系统属性,应该为:_A_HIDDEN | _A_RDONLY | _A_SYSTEM 。
原文链接:https://blog.csdn.net/wangqingchuan92/article/details/77979669
#include <iostream>
#include <string>
#include <vector>
//注意这个头文件
#include <io.h>
#include <direct.h>
using namespace std;
//核心函数
void getFileNames(string path, vector<string>& files);
std::string current_working_directory()
{
char buff[250];
_getcwd(buff, 250);
std::string current_working_directory(buff);
return current_working_directory;
}
int main(){
vector<string> fileNames;
string str=current_working_directory();
cout<<str;
//string path("D:\\test"); //自己选择目录测试
getFileNames(str, fileNames);
for (const auto &ph : fileNames) {
std::cout << ph << "\n";
}
return 0;
}
//核心代码
void getFileNames(string path, vector<string>& files)
{
//文件句柄
//注意:我发现有些文章代码此处是long类型,实测运行中会报错访问异常
intptr_t 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))//_A_SUBDIR说明这个文件是个文件夹
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
getFileNames(p.assign(path).append("\\").append(fileinfo.name), files);
//如果是目录,递归查找
}
else
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
//如果不是,把文件绝对路径存入vector中
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
感觉和遍历进程差不太多