1、_findfirst 的函数原型:
long _findfirst( char *filespec, struct _finddata_t *fileinfo );
它返回一个文件句柄,并将文件名匹配由 filespec 指定的模式的第一个文件的信息保存在 fileinfo 里。例如找某个目录下的 mp4 文件,那么 fileinfo 就保存了该目录下第一个mp4 文件的信息,调用方式如下,如果是32位系统:
long pFile = long _findfirst( "*.mp4", fileinfo );
如果是64位系统:
long long pFile = long _findfirst( "*.mp4", fileinfo );
而用来保存文件信息的 fileinfo 是一个数据类型为 _finddata_t 的结构体,在头文件#include
struct _finddata_t {
unsigned attrib; /*文件属性*/
time_t time_create; /*文件创建时间, -1 for FAT file systems */
time_t time_access; /*文件最后一次访问的时间 -1 for FAT file systems */
time_t time_write; /*文件最后一次写的时间*/
_fsize_t size; /*文件大小*/
char name[_MAX_FNAME]; /*匹配的文件名,不包含目录,_MAX_FNAME在STDLIB.H中定义为256字节*/
};
2、_findnext
函数原型:
int _findnext( long handle, struct _finddata_t *fileinfo );
这个函数调用如果成功就返回0,否则返回-1。它将下一个文件名匹配 filespec 的文件的信息保存在 fileinfo 里面,handle 是调用 _findfirst 时返回的句柄。比如说要得到下一个.mp4文件的信息,我们可以这样调用函数:
_findnext(pFile, fileinfo);
所以通过不断调用 _findnext 直到它返回-1就可以遍历所有的mp4文件了。
3、_findclose
int _findclose( long handle );
4、_A_SUBDIR(子目录)
5、综合实现函数-可直接调用
如果只需要特定的文件,比如.mp4、.jpg、.png 、.bmp等等,只需将
if ((hFile = _findfirst(pFile.assign(path).append("\\*").c_str(), &fileinfo)) != -1)将其修改为对应的
if ((hFile = _findfirst(pFile.assign(path).append("\\*.mp4").c_str(), &fileinfo)) != -1)。
//获取文件夹下所有的文件
void getFilesByFolder(std::string path, std::vector& files){
long long hFile = 0;//文件句柄
struct _finddata_t fileinfo; //文件信息
std::string pFile;
if ((hFile = _findfirst(pFile.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
{
do{
if ((fileinfo.attrib & _A_SUBDIR)){
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
getFilesByFolder(pFile.assign(path).append("\\").append(fileinfo.name), files);
}
else
files.push_back(pFile.assign(path).append("\\").append(fileinfo.name));
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}