略)関数公開その2Final→フォルダ内(以下)の特定のファイルへの絶対パスを取得

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

略)関数公開その2Final→フォルダ内(以下)の特定のファイルへの絶対パスを取得

投稿記事 by MoNoQLoREATOR » 14年前

正直、前回・前前回の関数はあまり実用的なものではありませんでした。今回こそは本当にちゃんとしたものをつくりました。次の2つです。

GetPassByExtention()・・・特定のフォルダ内(以下)で、指定した拡張子の全てのファイルへの絶対パスを得る
GetPassByWildCard()・・・特定のフォルダ内(以下)で、指定した名前のファイル(ワイルドカード使用可)への絶対パスを得る

以下ソースコード

CODE:

#include 
#include 
#include 
#include 
#include 

using namespace std;

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

int GetPassByExtention(const char *direName, const char *extens, vector &filePs, bool searchFlag){
	vector foundFNs;
	
	MoNoListUp(direName, "*", foundFNs, searchFlag, 0);
	
	for(size_t i=0;i &objPass, bool searchFlag){
    vector direNs;

    direNs.push_back(direName);
    
    if(searchFlag) MoNoListUp(direName, "*", direNs, 1, 1);
    
    for(size_t i=0;i &filePs, bool searchFlag)
第1引数・・・フォルダ名を指定します。
第2引数・・・拡張子をドット付きで指定します。複数ある場合は単純に列挙してください。
第3引数・・・絶対パスを格納するための変数(vector型)へのポインタを指定します。
第4引数・・・フォルダ直下のみなのかフォルダ以下全てなのかを指定します。
       フォルダ直下・・・0
       フォルダ以下・・・1

int GetPassByWildCard(const char *direName, const char *wild, vector &objPass, bool searchFlag)
第1引数・・・フォルダ名を指定します。
第2引数・・・パスを取得したいファイル名を指定します。ワイルドカードを使用することができます。
第3引数・・・絶対パスを格納するための変数(vector型)へのポインタを指定します。
第4引数・・・GetPassByExtentionの第4引数と同じです。

□使用例□
[code]int main(){
	vector eFns;
	vector wFns;
	
	int eNum = GetPassByExtention("C:\\Documents and Settings\\Administrator\\デスクトップ", ".mp3.wmv.avi.flv.zip", eFns, 1);
	int wNum = GetPassByWildCard("C:\\Documents and Settings\\Administrator\\デスクトップ", "*.*", wFns, 0);
	
	for(int i=0;i<eNum;i++) printf("%s\n", eFns[i].c_str());
	printf("拡張子:%d\n", eNum);
	for(int i=0;i<eNum;i++) printf("%s\n", eFns[i].c_str());
	printf("ワイルドカード:%d\n", wNum);
}
上記の例では、デスクトップ以下全ての、拡張子が「mp3,wmv,avi,flv,zip」であるファイルへの絶対パスを表示し、デスクトップ直下の全てのファイルへの絶対パスを表示しています。


最初は拡張子で指定するタイプのものしか作っていなかったのですが、それでは全ファイルへの絶対パスを取得することができないので、急遽ワイルドカードにも対応しました。ちなみにワイルドカードタイプの関数で”*”とだけ指定しても、フォルダへの絶対パスは含みません。


バグなどございましたらご報告頂けると幸いです。

naohiro19
記事: 256
登録日時: 14年前

Re: 略)関数公開その2Final→フォルダ内(以下)の特定のファイルへの絶対パスを取得

投稿記事 by naohiro19 » 14年前

.NET FrameworkだとOpenFileDialogクラスのFileNameプロパティでファイルのフルパスが取得できます。
[hr]
C++であればBoost.FileSystemですね。
最後に編集したユーザー naohiro19 on 2011年7月09日(土) 13:04 [ 編集 1 回目 ]