一、使用以下的结构体和函数
1._finddata_t 的使用
包含于io.h中,
包含以下属性
unsigned atrrib:文件属性,包含:_A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。
time_t time_create:文件创建时间
time_t time_access:文件最后一次被访问的时间。
time_t time_write:文件最后一次被修改的时间。
_fsize_t size:文件大小
char name[_MAX_FNAME]:文件的文件名。
- long _findfirst( char *filespec, struct _finddata_t *fileinfo );
filespec :文件类型,如*.c,表示当前文件夹下所有后缀为c的文件
fileinfo:存放文件信息的指针,需要提前申明,分配内存空间,无需初始化,成功后,将文件信息放入此结构体。
返回值:查找成功,将返回一个句柄,在_findnext函数中使用,失败返回-1。
- int _findnext( long handle, struct _finddata_t *fileinfo );
成功返回0,识别返回-1。
handle:_findfirst返回的句柄
fileinfo:查找文件成功后存储文件信息
- int _findclose( long handle );
关闭文件句柄
二、基本步骤
使用_findfirst函数查找目录下的第一个文件,如果存在,返回句柄
使用_findnext函数不断查找下一个文件直到结束
最后使用_findclose关闭句柄
三、代码实现
#include <io.h>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
//获取特定格式的文件名
void getAllFiles(string path, vector<string>& files,string format)
{
intptr_t hFile = 0;//文件句柄 64位下类型是intptr_t,32位下类型是long
struct _finddata_t fileinfo;//文件信息
string p;
if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1) //文件存在
{
do
{
if ((fileinfo.attrib & _A_SUBDIR))//判断是否为文件夹
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)//文件夹名中不含"."和".."
{
// files.push_back(p.assign(path).append("\\").append(fileinfo.name)); //保存文件夹名
getAllFiles(p.assign(path).append("\\").append(fileinfo.name), files, format); //递归遍历文件夹
}
}
else
{
char ext[32];
_splitpath(fileinfo.name, NULL, NULL, NULL, ext);//获取文件扩展名
string _ext = ext;
if(format==_ext)
files.push_back(p.assign(path).append("\\").append(fileinfo.name));//如果不是文件夹,储存文件名
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
int main()
{
string filePath = "C:\\Users\\l\\Desktop\\标注图库\\qx";
vector<string> files;
string format = ".jpg"; //查找文件的格式
getAllFiles(filePath, files,format);
int size = files.size();
for (int i = 0; i<size; i++)
{
cout << files[i] << endl; //输出完整的文件路径和名称
}
system("pause");
return 0;
}
参考:https://blog.csdn.net/u013749100/article/details/79664534
网友评论