Windows遍历文件夹

一点点高手 / 2023-05-14 / 原文

先用_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);
	}
}

感觉和遍历进程差不太多