VS2019中获取文件夹下指定文件类型的所有文件路径名

示例代码

#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函数返回的句柄

参考文献

C++ 获取文件夹下的所有文件名
Filename Search Functions

猜你喜欢

转载自blog.csdn.net/Star_ID/article/details/124456164#comments_27147161