#include<io.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <string>
/*
* 判断文件中是否含有查找的字符串
*/
bool searchString(string filePath, string strF)
{
std::ifstream file(filePath);
if (!file.is_open()) {
std::cerr << "无法打开文件: " << filePath << std::endl;
return false;
}
std::string line;
while (std::getline(file, line)) {
if (line.find(strF) != std::string::npos) {
file.close();
return true; // 找到子字符串,返回true
}
}
file.close();
return false; // 遍历完整个文件都没有找到,返回false
}
/*
* dir 子目录路径
* vector<std::string>& folders 子目录
* std::vector<std::string>& files 子文件
* std::vector<std::string> filter= {} 过滤条件
*/
static void findStringFile(const std::string& dir, std::vector<std::string>& folders, std::vector<std::string>& files,std::vector<std::string> filter = {})
{
struct _finddata_t file;
std::string path = dir + "/*";
auto h = _findfirst(path.c_str(), &file);
if (h == -1)
{
return;
}
do {
if (0 == strncmp(file.name, ".", 1) || 0 == strncmp(file.name, "..", 2))
{
continue;
}
if (file.attrib == _A_SUBDIR)
{
// 目录名字添加到folders
folders.push_back(dir + "/" +file.name);
}
else
{
for (const auto &it : filter)
{
if (searchString(dir + "/" + file.name, it))
{
// 文件名字添加到folders
files.push_back(dir + "/" + file.name);
}
}
}
} while (!_findnext(h,&file));
_findclose(h);
}
/* 扫描目录下所有文件 非递归 水平优先
* dir 目录路径
*/
static void searchdir(const std::string &dir, std::vector<std::string> &files, std::vector<std::string> filter = {})
{
std::vector<std::string> folders;
findStringFile(dir, folders, files, filter);
while (folders.size())
{
std::vector<std::string> foldersChildren;
for (const auto& foledr : folders)
{
std::vector<std::string> tfiles;
std::vector<std::string> tfolders;
findStringFile(foledr, tfolders, tfiles, filter);
files.insert(files.end(), tfiles.begin(), tfiles.end());
foldersChildren.insert(foldersChildren.end(), tfolders.begin(), tfolders.end());
}
folders = foldersChildren;
}
}
/* 扫描目录下所有文件 非递归 垂直优先
* dir 目录路径
*/
static void searchdirRecursion(const std::string &dir, std::vector<std::string> &files, std::vector<std::string> filter= {})
{
std::vector<std::string> folders;
struct _finddata_t file;
std::string path = dir + "/*";
auto h = _findfirst(path.c_str(), &file);
if (h==-1)
{
return;
}
do{
if (0==strncmp(file.name,".",1) || 0== strncmp(file.name,"..",2))
{
continue;
}
if (file.attrib==_A_SUBDIR)
{
path = dir + file.name;
searchdirRecursion(path, files, filter);
}
else
{
for (const auto &it:filter)
{
if (searchString(dir + "/" + file.name, it))
{
// 文件名字添加到folders
files.push_back(dir + "/" + file.name);
}
}
}
} while (!_findnext(h, &file));
_findclose(h);
}
void main()
{
//searchdir("E:/work/");
std::vector<std::string> files;
std::vector<std::string> filter;
filter.push_back("hello");
//searchdirRecursion("E:/log/", files, filter);
searchdir("E:/log/", files, filter);
return;
}
window C++ 遍历目录下所有文件
于 2024-03-11 17:46:59 首次发布