以下ソースコード
#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の知識が必要です)
いや~、ひょんなことから「フォルダ以下のファイル名を全部知りたい」ということになったので検索してみたのですが、そういう標準関数は存在しないのですね。驚きました。かなり面倒くさいことをしなければならなかったので頭の中がコンガラガッチュレーションになりましたがほんのついさっき完成したのでこうして公開したという次第であります。
バグなどありましたら報告して頂けると幸いです。