本文记录了在VS编译器中,使用C++语言读取文件夹下的文件数量和文件名,分为指定后缀的文件,和不带后缀的任意文件。
文章目录
结果展示:
一、测试主程序
.h文件
#include <vector>
void getAllFiles(std::string path, std::vector<std::string>& files, std::string format);
void getAllFiles(std::string path, std::vector<std::string>& files);
int GetFileNum(const std::string& inPath, std::string format);
int GetFileNum(const std::string& inPath);
.cpp测试主程序
#include "stdafx.h"
#include "getAllFilesTest.h"
#include<io.h>
#include <iostream>
#include <ctime>
#include <regex>
#include<io.h>
#include<queue>
using namespace std;
int main()
{
std::string strFolderName = "E:\\RemoteSensing\\inputdata";//数据路径
vector<std::string> files;
getAllFiles(strFolderName, files, ".tif");//获取后缀为.tif的所有文件路径
//getAllFiles(strFolderName, files);//获取所有文件路径
//getFileName(strFolderName, files, ".tif");//获取后缀为.tif的所有文件名字
//getFileName(strFolderName, files, ".tif");//获取后缀所有文件名字
int nFileNumble1 = files.size();//tif的个数
for (int i = 0; i < nFileNumble1; i++)
{
std::cout << files[i].c_str() << std::endl;
}
int nFileNumble2 = GetFileNum(strFolderName, ".tif");//获取后缀.tif的所有文件个数
std::cout << "tif文件个数:" <<nFileNumble2 << std::endl;
int nFileNumble3 = GetFileNum(strFolderName);//获取所有文件个数
std::cout << "所有文件个数:" <<nFileNumble3 << std::endl;
system("pause");
return 0;
}
函数:
二、读取文件夹下所有文件(指定后缀)
//读取文件夹下所有文件(指定后缀)
void CFileStream::getAllFiles(string strFolderPath, vector<string>& vecFiles, string format)
{
intptr_t hFile = 0;//文件句柄,过会儿用来查找
struct _finddata_t fileinfo;//文件信息,声明一个存储文件信息的结构体
string p;
if ((hFile = _findfirst(p.assign(strFolderPath).append("//*" + format).c_str(), &fileinfo)) != -1)
//如果查找到第一个文件
{
do
{
//如果是文件夹,迭代(即文件夹内还有文件夹)
if ((fileinfo.attrib & _A_SUBDIR))
{
//文件名不等于"."&&文件名不等于".."
//.表示当前目录
//..表示当前目录的父目录
//判断时,两者都要忽略,不然就无限递归跳不出去了!
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
getAllFiles(p.assign(strFolderPath).append("\\").append(fileinfo.name), vecFiles, format);
;
}
else//如果是文件,加入数组
{
vecFiles.push_back(p.assign(strFolderPath).append("\\").append(fileinfo.name));
}
} while (_findnext(hFile, &fileinfo) == 0); //能寻找到其他文件
_findclose(hFile); //结束查找,关闭句柄
}
}
三、读取文件夹下所有文件(不指定后缀)
//读取文件夹下所有文件(不指定后缀)
void CFileStream::getAllFiles(string strFolderPath, vector<string>& vecFiles)
{
intptr_t hFile = 0;//文件句柄,过会儿用来查找
struct _finddata_t fileinfo;//文件信息
string p;
if ((hFile = _findfirst(p.assign(strFolderPath).append("//*").c_str(), &fileinfo)) != -1)
//如果查找到第一个文件
{
do
{
if ((fileinfo.attrib & _A_SUBDIR))//如果是文件夹
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
getAllFiles(p.assign(strFolderPath).append("\\").append(fileinfo.name), vecFiles);
;
}
else//如果是文件
{
vecFiles.push_back(p.assign(strFolderPath).append("\\").append(fileinfo.name));
}
} while (_findnext(hFile, &fileinfo) == 0); //能寻找到其他文件
_findclose(hFile); //结束查找,关闭句柄
}
}
四、获得文件夹下的所有文件个数(指定后缀)
//获得文件夹下的所有文件个数(指定后缀)
int GetFileNum(const std::string& inPath, std::string format)
{
int fileNum = 0;
std::vector<std::string> pathVec;
std::queue<std::string> q;
q.push(inPath);
while (!q.empty())
{
std::string item = q.front(); q.pop();
std::string path = item + "\\*" + format;
struct _finddata_t fileinfo;
auto handle = _findfirst(path.c_str(), &fileinfo);
if (handle == -1) continue;
while (!_findnext(handle, &fileinfo))
{
if (fileinfo.attrib & _A_SUBDIR)
{
if (strcmp(fileinfo.name, ".") == 0 || strcmp(fileinfo.name, "..") == 0)continue;
q.push(item + "\\" + fileinfo.name);
}
else
{
fileNum++;
pathVec.push_back(item + "\\" + fileinfo.name);
}
}
_findclose(handle);
}
return fileNum;
}
五、获得文件夹下所有文件个数(不指定后缀)
//获得文件夹下所有文件个数(不指定后缀)
int CFileStream::GetFileNum(const std::string& inPath)
{
int fileNum = 0;
std::vector<std::string> pathVec;
std::queue<std::string> q;
q.push(inPath);
while (!q.empty())
{
std::string item = q.front(); q.pop();
std::string path = item + "\\*";
struct _finddata_t fileinfo;
auto handle = _findfirst(path.c_str(), &fileinfo);
if (handle == -1) continue;
while (!_findnext(handle, &fileinfo))
{
if (fileinfo.attrib & _A_SUBDIR)
{
if (strcmp(fileinfo.name, ".") == 0 || strcmp(fileinfo.name, "..") == 0)continue;
q.push(item + "\\" + fileinfo.name);
}
else
{
fileNum++;
pathVec.push_back(item + "\\" + fileinfo.name);
}
}
_findclose(handle);
}
return fileNum;
}
六、获得文件夹下所有文件名称(指定后缀)
//读取文件夹下所有文件的名字(指定后缀)
void getFileName(string strFolderPath, vector<string>& vecFiles, string format)
{
intptr_t hFile = 0;//文件句柄,过会儿用来查找
struct _finddata_t fileinfo;//文件信息
string p;
if ((hFile = _findfirst(p.assign(strFolderPath).append("//*" + format).c_str(), &fileinfo)) != -1)
//如果查找到第一个文件
{
do
{
if ((fileinfo.attrib & _A_SUBDIR))//如果是文件夹
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
getFileName(p.assign(strFolderPath).append("\\").append(fileinfo.name), vecFiles, format);
;
}
else//如果是文件
{
vecFiles.push_back(fileinfo.name);
}
} while (_findnext(hFile, &fileinfo) == 0); //能寻找到其他文件
_findclose(hFile); //结束查找,关闭句柄
}
}
七、获得文件夹下所有文件名称(不指定后缀)
//读取文件夹下所有文件的名字(不指定后缀)
void getFileName(string strFolderPath, vector<string>& vecFiles)
{
intptr_t hFile = 0;//文件句柄,过会儿用来查找
struct _finddata_t fileinfo;//文件信息
string p;
if ((hFile = _findfirst(p.assign(strFolderPath).append("//*").c_str(), &fileinfo)) != -1)
//如果查找到第一个文件
{
do
{
if ((fileinfo.attrib & _A_SUBDIR))//如果是文件夹
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
getFileName(p.assign(strFolderPath).append("\\").append(fileinfo.name), vecFiles);
;
}
else//如果是文件
{
vecFiles.push_back(fileinfo.name);
}
} while (_findnext(hFile, &fileinfo) == 0); //能寻找到其他文件
_findclose(hFile); //结束查找,关闭句柄
}
}