C++指定フォルダ内の指定ファイルを読み込む

15235 ワード

ヘッダファイル、構造体struct_を覚えておいてください.finddata_t,関数_findfirst、_fidnextと_findclose.
構造体_finddata_t
struct _finddata_t { unsigned attrib; time_t time_create; time_t time_access; time_t time_write; _fsize_t size; char name[_MAX_FNAME]; };
unsigned atrrib:ファイル属性の格納場所.ファイルのプロパティを表すunsignedユニットが格納されます.ファイルのプロパティはビットで表されます.主に以下のものがあります.A_ARCH(アーカイブ),A_HIDDEN(隠し),A_NORMAL(正常),A_RDONLY(読み取り専用)、A_SUBDIR(フォルダ),A_システム.これらは、で定義されたマクロであり、直接使用することができますが、自体の意味は符号なしの整数です(ただし、この整数は2の数回のべき乗であるべきで、1ビットのみが1であり、他のビットは0であることを保証します).ビット表現である以上、1つのファイルに複数の属性がある場合、ビットまたは方法によって、いくつかの属性の統合が得られることが多い.たとえば、読み取り専用+非表示+システム属性は、次のようになります.A_HIDDEN | _A_RDONLY | _A_SYSTEM .
time_t time_create:ここのtime_tは変数タイプ(長整型?long intに相当)であり、時間を保存するために使われているのは、私たちはしばらく相手にしなくてもいいです.知っていれば、このtime_create変数は、ファイル作成時間を格納するために使用すればよい.
time_t time_アクセス:ファイルが最後にアクセスされた時間.
time_t time_write:ファイルが最後に変更された時間.
_fsize_t size:ファイルのサイズ.ここの_fsize_tはunsigned整数に相当し、ファイルのバイト数を表すことができるはずです.
char name[_MAX_FNAME]:ファイルのファイル名.ここの_MAX_FNAMEは、ファイル名の最大長を表すヘッダファイルで定義される定数マクロです.
関数_findfirst、_fidnextと_findclose
long _findfirst( char * filespec, struct _finddata_t * fileinfo ); 戻り値:検索に成功すると、long型の一意の検索用ハンドル(一意の番号)が返されます.このハンドルは_findnext関数で使用されます.失敗した場合は-1を返します.パラメータ:filespec:ファイルを表す文字列で、ワイルドカードをサポートします.例:*.cは、現在のフォルダの下にあるすべての接尾辞がCのファイルを表す.fileinfo:ここではファイル情報を格納するための構造体のポインタです.この構造体は、この関数を呼び出す前に宣言する必要がありますが、初期化する必要はありません.メモリ領域が割り当てられている限りです.関数が成功すると、関数は見つけたファイルの情報をこの構造体に入れます.
int _findnext( long handle, struct _finddata_t *fileinfo ); 戻り値:0が正常に返された場合、-1が返されます.パラメータ:handle:アドホック_findfirst関数が返すハンドル.fileinfo:ファイル情報構造体のポインタ.ファイルが見つかったら、関数はファイル情報をこの構造体に挿入します.
int _findclose( long handle ); 戻り値:0が正常に返され、-1が失敗しました.パラメータ:handle:findfirst関数は、戻ってきたハンドルを返します.
単純な実験ソース
#include
#include
#include
#include
#include
#include
using namespace std;

void getFiles(string path, vector<string> &files, string format)
{
	intptr_t hFile;//     intptr_t   ,      long  。   long  ,   x64       !
	_finddata_t fileInfo;

	path.append("\\*" + format);

	if ((hFile = _findfirst(path.c_str(), &fileInfo)) != -1)
	{
		do
		{
			files.push_back(fileInfo.name);
		} while (_findnext(hFile, &fileInfo) != -1);
		cout << "        ,                 !

"
; } else cout << " !

"
; _findclose(hFile); return; } void output(vector<string> files, string path) { ofstream outfile(path); for (vector<string>::iterator it = files.begin(); it != files.end(); it++) outfile << *it << endl; outfile.close(); } int main() { vector<string> v_files; // , "test" "." getFiles("test", v_files, ".txt"); output(v_files, "data.txt"); return 0; }

次のコードは、x 64プラットフォームとx 86プラットフォームと互換性があります.
#include
#include
#include
#include
using namespace std;

void getFiles(string path, vector<string> &files, string format)
{
	intptr_t hFile;
	__finddata64_t fileInfo;

	path.append("\\*" + format);

	if ((hFile = _findfirst64(path.c_str(), &fileInfo)) != -1)
	{
		do
		{
			files.push_back(fileInfo.name);
		} while (_findnext64(hFile, &fileInfo) != -1);
		cout << "   " << files.size() << "   
"
; } else cout << " !
"
; _findclose(hFile); } int main() { vector<string> files; getFiles("2", files, ".jpg"); for (vector<string>::iterator it = files.begin(); it != files.end(); it++) { cout << *it << endl; } return 0; }