示例代码
#include <iostream>
#include <string>
#include <vector>
#include <io.h>
using namespace std;
void getFilesName(string& fileDirectory, string& fileType, vector<string>& filesPath);
int main()
{
string fileDirectory = "D:/VS2019Projects/cameraCalibration/cameraCalibration/chessImage";
string fileType = ".jpg"; //查找指定的文件类型
vector<string> filesPath; //存放文件路径名的容器
getFilesName(fileDirectory, fileType, filesPath); //寻找文件的路径
//遍历输出
for (vector<string>::iterator i = filesPath.begin(); i < filesPath.end(); i++) {
cout << "filesPath: " << *i << endl;
}
return 0;
}
void getFilesName(string& fileDirectory, string& fileType, vector<string>& filesPath)
{
string buffer = fileDirectory + "\\*" + fileType;
_finddata_t fileInfo; //存放文件信息的结构体
intptr_t hFile;
hFile = _findfirst(buffer.c_str(), &fileInfo); //找第一个文件
if (hFile == -1L) {
//没找到指定类型的文件
cout << "No " << fileType << " files in current directory!" << endl;
}
else {
string fullFilePath;
do {
fullFilePath.clear();
fullFilePath = fileDirectory + "\\" + fileInfo.name;
filesPath.push_back(fullFilePath);
} while (_findnext(hFile, &fileInfo) == 0); //如果找到下个文件的名字成功的话就返回0,否则返回-1
_findclose(hFile);
}
}
/*输出结果:
filesPath: D:/VS2019Projects/cameraCalibration/cameraCalibration/chessImage\left01.jpg
filesPath: D:/VS2019Projects/cameraCalibration/cameraCalibration/chessImage\left02.jpg
filesPath: D:/VS2019Projects/cameraCalibration/cameraCalibration/chessImage\left03.jpg
filesPath: D:/VS2019Projects/cameraCalibration/cameraCalibration/chessImage\left04.jpg
filesPath: D:/VS2019Projects/cameraCalibration/cameraCalibration/chessImage\left05.jpg
filesPath: D:/VS2019Projects/cameraCalibration/cameraCalibration/chessImage\left06.jpg
filesPath: D:/VS2019Projects/cameraCalibration/cameraCalibration/chessImage\left07.jpg
filesPath: D:/VS2019Projects/cameraCalibration/cameraCalibration/chessImage\left08.jpg
filesPath: D:/VS2019Projects/cameraCalibration/cameraCalibration/chessImage\left09.jpg
filesPath: D:/VS2019Projects/cameraCalibration/cameraCalibration/chessImage\left11.jpg
filesPath: D:/VS2019Projects/cameraCalibration/cameraCalibration/chessImage\left12.jpg
filesPath: D:/VS2019Projects/cameraCalibration/cameraCalibration/chessImage\left13.jpg
filesPath: D:/VS2019Projects/cameraCalibration/cameraCalibration/chessImage\left14.jpg
*/
结构体_finddata_t
该结构体用于存储文件信息,定义在io.h
中(其实在corecrt_io.h
中)
#ifdef _USE_32BIT_TIME_T
#define _finddata_t _finddata32_t
#define _finddatai64_t _finddata32i64_t
#else
#define _finddata_t _finddata64i32_t
#define _finddatai64_t __finddata64_t
#endif
具体定义如下
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];
};
元素 | 含义 |
---|---|
attrib | 文件属性 |
time_create | 文件创建时间(FAT 文件系统为-1L)。此时间以 UTC 格式存储。 要转换为本地时间,请使用 localtime_s。 |
time_access | 上次文件访问的时间(FAT 文件系统为 -1L)。 此时间以 UTC 格式存储。 要转换为本地时间,请使用 localtime_s。 |
time_write | 上次写入文件的时间。 此时间以 UTC 格式存储。 要转换为本地时间,请使用 localtime_s。 |
size | 文件的长度(以字节为单位) |
name[260] | 文件名 |
文件属性有如下几种
// File attribute constants for the _findfirst() family of functions
#define _A_NORMAL 0x00 // Normal file - No read/write restrictions
#define _A_RDONLY 0x01 // Read only file
#define _A_HIDDEN 0x02 // Hidden file
#define _A_SYSTEM 0x04 // System file
#define _A_SUBDIR 0x10 // Subdirectory
#define _A_ARCH 0x20 // Archive file
Filename Search Functions
_findfirst
宏定义
#ifdef _USE_32BIT_TIME_T
#define _findfirst _findfirst32
#define _findnext _findnext32
#define _findfirsti64 _findfirst32i64
#define _findnexti64 _findnext32i64
#else
#define _findfirst _findfirst64i32
#define _findnext _findnext64i32
#define _findfirsti64 _findfirst64
#define _findnexti64 _findnext64
#endif
函数原型
intptr_t _findfirst(
const char *filespec,
struct _finddata_t *fileinfo
);
返回值:如果查找成功的话,将返回一个intptr_t
型的唯一的查找用的句柄(就是一个唯一编号)。这个句柄将在_findnext
函数中被使用。若失败,则返回-1。
参数 | 含义 |
---|---|
filespec | 标明文件的字符串,可支持通配符。比如:*.c,则表示当前文件夹下的所有后缀为C的文件。 |
fileinfo | 用来存放文件信息的结构体指针。这个结构体必须在调用此函数前声明,不过不用初始化,只要分配内存空间就行。函数成功后,函数会把找到的文件的信息放入这个结构体中。 |
_findnext和_findclose
宏定义
#ifdef _USE_32BIT_TIME_T
#define _findfirst _findfirst32
#define _findnext _findnext32
#define _findfirsti64 _findfirst32i64
#define _findnexti64 _findnext32i64
#else
#define _findfirst _findfirst64i32
#define _findnext _findnext64i32
#define _findfirsti64 _findfirst64
#define _findnexti64 _findnext64
#endif
_findnext
函数原型
int _findnext(
intptr_t handle,
struct _finddata_t *fileinfo
);
返回值:若成功返回0,否则返回-1
参数 | 含义 |
---|---|
handle | 由_findfirst函数返回的句柄 |
fileinfo | 文件信息结构体的指针。找到文件后,函数将该文件信息放入此结构体中。 |
_findclose
函数原型
int _findclose(
intptr_t handle
);
如果成功,则_findclose返回0。否则,它将返回-1并将Errno设置为Enoent,表明找不到更多匹配的文件。
参数 | 含义 |
---|---|
handle | 由_findfirst函数返回的句柄 |
参考文献