赞
踩
在做项目的时候,我们有时候会遇到给定一个文件夹目录,获取该目录下某种类型的文件的路径。也就是遍历一个目录下的所有文件。经过查询,发现可以通过
#include <io.h>
#include <string>
#include <vector>
#include <fstream>
void getAllFiles(string path, vector<string>&files, string fileType){
//文件句柄
long hFile = 0;
struct _finddata_t fileInfo;
string p;
if ((hFile = _findfirst(p.assign(path).append("\\*" + fileType).c_str(), &fileInfo)) != -1){
do{
files.push_back(p.assign(path).append("\\").append(fileInfo.name));
} while (_findnext(hFile, &fileInfo) == 0);
_findclose(hFile);//关闭句柄
}
}
int main(){
vector<string> temp;
getAllFiles("..\\Data\\AddImages", temp, ".jpg");
for (int i = 0; i < temp.size(); i++){
cout << temp[i] << endl;
}
}
测试结果:
void getAllFiles(string path, vector<string>& files)
{
// 文件句柄
long hFile = 0;
// 文件信息
struct _finddata_t fileinfo;
string p;
if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1) {
do {
// 保存文件的全路径
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
} while (_findnext(hFile, &fileinfo) == 0); //寻找下一个,成功返回0,否则-1
_findclose(hFile);
}
}
void getAllFiles(string path, vector<string>& files) {
//文件句柄
long 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)) { //比较文件类型是否是文件夹
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);
}
}
else {
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
}
} while (_findnext(hFile, &fileinfo) == 0); //寻找下一个,成功返回0,否则-1
_findclose(hFile);
}
}
注意:使用_findfirst()、_findnext()进行搜索时,可能会得到”.”和”..”两个文件夹名。这两个值可以忽略
struct _finddata64i32_t {
unsigned attrib;
__time64_t time_create; /* -1 for FAT file systems */
__time64_t time_access; /* -1 for FAT file systems */
__time64_t time_write;
_fsize_t size;
char name[260];
};
unsigned attrib:
标识文件的属性。文件的属性,主要有下面这些:_A_ARCH(存档)、 _A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。这些都是在宏中定义,可以直接使用。attrib ,从数据类型上来说,就是一个无符号整型数据,它是按照某位为1,其余位为零来定义一个文件的属性,这样做有一个好处,就是当一个文件有多个属性的时,可以直接按位或方式表示。列如,当一个文件具有只读+隐藏+系统属性的时候,应该表示为A_HIDDEN | _A_RDONLY | _A_SYSTEM。**
__time64_t time_create: 表示一个文件的创建时间。
__time64_t time_access:表示一个文件最后访问时间。
__time64_t time_write:表示一个文件最后修改时间。
_fsize_t size:表示一个文件的大小(字节数)。
char name[260]:表示一个文件的名字。
intptr_t _findfirst( const char * filespec, struct _finddata_t *fileinfo);
参数:
char *filespec,目标文件描述(可包含通配符)。
_finddata_t* 类型,函数将会把获得结果,存入该结构体。
返回值:
如果成功,返回一个唯一的搜索句柄标识或一组和filespec说明的匹配文件,可以用于接下来的_findnexe()和_findclose()函数。
int _findnext( intptr_t handle,struct _finddata_t *fileinfo);
参数:
intptr_t handle ,搜索句柄,_finddata_t* ,存入查询结果。
返回值:
如果成功,返回0,否则返回-1。
int _findclose( intptr_t handle);
作用:关闭资源。
参数:intptr_t handle,搜索句柄 。
返回值:成功0,否则-1。
希望对您有所帮助!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。