ゲームに役立つ・・・かもしれない便利な関数を公開その2

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

ゲームに役立つ・・・かもしれない便利な関数を公開その2

投稿記事 by MoNoQLoREATOR » 14年前

今回公開する関数は、フォルダ名とファイルの種類を指定すると、(その直下またはそれ以下の)該当する全ファイル名を取得することができるというものです。

以下ソースコード

CODE:

#include 
#include 
#include 
#include 

using namespace std;

vector fNames;

void MoNoListUp(char *direName, char *kind, int searchFlag){
	WIN32_FIND_DATA fData;				//ファイル又はフォルダの情報がここに格納される
	HANDLE fHand;					//検索時のハンドルを格納
	{
	char seDirName[_MAX_PATH];			//一時的にフォルダ名を記憶しておくだけ
	sprintf(seDirName,"%s\\%s",direName,kind);	//フォルダ名に\\ワイルドカードを連結
	fHand = FindFirstFile(seDirName, &fData);	//検索を行い、ハンドルを取得
	}
	
	//ファイル又はフォルダがみつかった ならば
	if(fHand != INVALID_HANDLE_VALUE){
		do{
        		// '.'や'..'以外だった ならば
			if(strcmp(fData.cFileName, ".") && strcmp(fData.cFileName, "..") ) {
				//見つかったのがフォルダだった ならば
				if(fData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
					//フォルダ以下全検索に設定されている ならば サブフォルダの処理
					if(searchFlag){
			        		char sFindSubDir[_MAX_PATH];	//フォルダ名格納用
						
			        		strcpy(sFindSubDir, direName);	//検索フォルダのフルパス文字列をコピー
			        		strcat(sFindSubDir, "\\");	//文字列に\\を追加
			        		strcat(sFindSubDir, fData.cFileName);//検索結果のフォルダ名を文字列に追加
			        		MoNoListUp(sFindSubDir, kind, 1);	// 再帰呼び出し
					}
				} else {
          				// ファイルのとき
          				fNames.push_back(fData.cFileName);	//ファイル名を記憶
        			}
			}
		} while(FindNextFile(fHand, &fData));
		FindClose(fHand);	//検索に使用したデータを破棄
	}
  	//ファイルもフォルダもみつからなかった ならば
	else fNames.push_back("ファイルがありません");
}

第1引数はフォルダ名。 C:¥Documents and Settings¥Administrator¥デスクトップ などと指定してください。※都合により円マークが全角ですが、実際に入力する際は半角で入力してください
ただし、 MoNoListUp(   "C:¥¥Documents and Settings¥¥Administrator¥¥デスクトップ"   ,"*",1); というように入力しないと、¥の特殊な効果が発動されてしまってうまくいきませんのでご注意を。

第2引数はファイルの種類。 ? * などのワイルドカードを指定するものだと思ってください。全ファイル名を取得したければMoNoListUp(~,   "*"   ,1);というように指定すればOKです。mp3ファイルの名前だけを取得したければMoNoListUp(~,   "*.mp3"   ,1);というように指定する、といった具合です。

第3引数は、フォルダ直下 なのか フォルダ以下全て なのかを指定する値をを入れてください。
フォルダ直下・・・0
フォルダ以下・・・1
です。


取得したファイル名は、fNamesというstring型の配列変数に拡張子付きで格納されているので、自由に使ってください。(vector,stringというSTLの知識が必要です)



いや~、ひょんなことから「フォルダ以下のファイル名を全部知りたい」ということになったので検索してみたのですが、そういう標準関数は存在しないのですね。驚きました。かなり面倒くさいことをしなければならなかったので頭の中がコンガラガッチュレーションになりましたがほんのついさっき完成したのでこうして公開したという次第であります。

バグなどありましたら報告して頂けると幸いです。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: ゲームに役立つ・・・かもしれない便利な関数を公開その2

投稿記事 by MoNoQLoREATOR » 14年前

すみません。このソースコードだと第2引数に*と指定しないと全部失敗します。
ちょっと修正してきます。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: ゲームに役立つ・・・かもしれない便利な関数を公開その2

投稿記事 by MoNoQLoREATOR » 14年前

CODE:

#include 
#include 
#include 
#include 

using namespace std;

vector fNames;
vector folderN;

void MoNoSearchFile(char *seDirName, bool flagFF){
	WIN32_FIND_DATA fData;				//ファイル又はフォルダの情報がここに格納される
	HANDLE fHand = FindFirstFile(seDirName, &fData);	//検索時のハンドルを格納

	if(fHand != INVALID_HANDLE_VALUE){
		do{
       			// '.'や'..'以外だった ならば
			if(strcmp(fData.cFileName, ".") && strcmp(fData.cFileName, "..") ) {
				//見つかったのがファイルだった && フラグがファイル ならば ファイル名を記憶
				if(fData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY    == 0       &&        flagFF==0) fNames.push_back(fData.cFileName);
				//見つかったのがフォルダだった && フラグがフォルダ ならば フォルダ名を記憶
				if(fData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY       &&        flagFF) folderN.push_back(fData.cFileName);        				}
		} while(FindNextFile(fHand, &fData));
		FindClose(fHand);	//検索に使用したデータを破棄
	}
	//ファイルもフォルダもみつからなかった ならば
	else fNames.push_back("ファイルがありません");
}

void MoNoListUp(char *direName, char *kind, bool searchFlag){
	char seDirName[_MAX_PATH];

	//フォルダ以下全検索に設定されている ならば
	if(searchFlag){
		sprintf(seDirName,"%s\\*",direName);
		MoNoSearchFile(seDirName,1);

		for(int i=0;i<folderN.size();i++){
			sprintf(seDirName,"%s\\%s",folderN[i].c_str(),kind);
			MoNoSearchFile(seDirName, 0);
		}
	}else{
	//フォルダ直下検索に設定されている ならば

		sprintf(seDirName,"%s\\%s",direName,kind);
		MoNoSearchFile(seDirName, 0);
	}
}
こんなの考えてみたんだけど

ファイルがありません
ファイルがありません
ファイルがありません
ファイルがありません
ファイルがありません

って出て戦意喪失した・・・。晩ご飯食べてから再開しよう。うん。そうしよう。あと、このコードではかなり無駄が多い気がする。もっと簡潔にまとめることができないのだろうか・・・。

xxx
記事: 26
登録日時: 14年前

Re: ゲームに役立つ・・・かもしれない便利な関数を公開その2

投稿記事 by xxx » 14年前

winならdir使ってその部分だけ切り出す・・・
だと何の意味もないか