サンプルコード
#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 関数によって返されるハンドル |
参考文献