最近做一个小项目需要获取某个文件夹下面所有的图片的名称,经过上网查阅资料和相关学习,现在完成了这个功能。在这里与大家分享,也算对知识的复习和梳理。
首先来看一下几个相关的函数和结构:
(1)_finddata_t结构:
该结构存储后面用到的_findfirst等函数需要用到的文件的信息。
struct _finddata_t
{
unsigned attrib; //文件的属性信息,例如_A_ARCH 存档,_A_HIDDEN 隐藏,_A_SUBDIR 文件夹等;完整的查看MSDN介绍。
time_t time_create; //文件创建时间
time_t time_access; //文件最后被访问的时间
time_t time_write;//文件最后被改写的时间
_fsize_t size;//文件的大小
char name[MAX_FNAME]; //文件名称
};
(2)_findfirst()函数:
long _findfirst(char* filespec, struct _finddata_t *fileinfo)
参数:filespec 指定一个需要查找的样式,例如 "D:/test/*.png",可以用*来描述所有需要的类型,具体参照下面的demo。
fileinfo 将匹配的文件信息存入fileinfo中。
函数功能:将第一个与filespec匹配的文件信息存入fileinfo中,主要获取的信息为该结构中的文件名。
返回值:如果成功则返回一个独一无二的搜索句柄来标识这个或这组文件。即一个long 类型的值。这个long值可视为句柄,随后可以用在调用_findnext()函数中。
如果失败则返回-1,并将errno设置成以下等值:ENOENT,EINVAL等。具体查阅MSDN。
(3)_findnext()函数;
long _findnext(long handle, struct _finddata_t *fileinfo)
参数:handle即之前调用_findfirst函数返回的一个long类型的值。
fileinfo 将下一个匹配的文件信息存入fileinfo中。
函数功能:查找下一个匹配的名字,匹配的格式由_findfirst()中参数指定的,找到的话就更改fileinfo的内容。
返回值:成功则返回0,不成功返回-1。
(4) _findclose()函数:
int _findclose(long handle)
参数:handle即之前调用_findfirst()返回的long类型的值。
功能:关闭指定搜索句柄,释放相关资源。
返回值:如果成功则返回0;否则返回-1,并设置相关errno的值。
下面的程序完成指定的路径下所有的png的文件名的获取:
#include "stdafx.h"
#include
#include
#include
#include
using namespace std;
bool findfilenames(string path, string end, vector
{
long hFile;
string fullname, endname;
struct _finddata_t fileinfo;
endname = "/*." + end;
if ((hFile = _findfirst(fullname.assign(path).append(endname).c_str(), &fileinfo)) != -1)
{
do
{
files.push_back(fullname.assign(path).append("/").append(fileinfo.name));
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
return true;
}
int main()
{
string path = "E:/GPEditor/in";
string end = "png";
vector
bool b = findfilenames(path, end, myfiles);
for (vector
cout << *it << endl;
return 0;
}
改程序还不算完善,仅仅完成简单功能,并没有错误的检查以及子目录的查找等功能。程序中用到一些简单函数assign(),append()等。