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];
};
エレメント 意味
属性 ファイルのプロパティ
時間作成 ファイル作成時間 (FAT ファイル システムの場合は -1L)。この時刻は UTC 形式で保存されます。現地時間に変換するには、localtime_s を使用します。
時間アクセス 最後にファイルにアクセスした時刻 (FAT ファイルシステムの場合は -1L)。この時刻は UTC 形式で保存されます。現地時間に変換するには、localtime_s を使用します。
time_write ファイルが最後に書き込まれた時刻。この時刻は UTC 形式で保存されます。現地時間に変換するには、localtime_s を使用します。
サイズ ファイルの長さ (バイト単位)
名前[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

ファイル名検索機能

_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 が返されます。

パラメータ 意味
ファイルスペック ファイルを識別する文字列、ワイルドカードがサポートされています。例: *.c は、現在のフォルダー内にあるサフィックス C を持つすべてのファイルを意味します。
ファイル情報 ファイル情報を格納するために使用される構造体へのポインタ。この構造体は、この関数を呼び出す前に宣言する必要がありますが、メモリ空間が割り当てられている限り、初期化する必要はありません。関数が成功すると、関数は見つかったファイルの情報をこの構造体に入れます。

_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 を返します。

パラメータ 意味
取り持つ _findfirst 関数によって返されるハンドル
ファイル情報 ファイル情報構造体へのポインタ。ファイルが見つかると、関数はファイル情報をこの構造に入れます。

_findclose関数プロトタイプ

int _findclose(
   intptr_t handle
);

_findclose は成功すると 0 を返します。それ以外の場合は、-1 を返し、Errno を Enoent に設定し、一致するファイルがそれ以上見つからなかったことを示します。

パラメータ 意味
取り持つ _findfirst 関数によって返されるハンドル

参考文献

C++ フォルダー内のすべてのファイル名を取得する
ファイル名検索関数

おすすめ

転載: blog.csdn.net/Star_ID/article/details/124456164#comments_27147161