CでもC++でもいいのですが、
あるフォルダを指定した時、その中にあるすべてのフォルダ及びファイル
の絶対パスを調べるにはどうしたらよいですか?
自分としては、どこぞの配列に入っているとうれしいのですが。
教えてください。
宜しくお願いします。
FindFirstFile()とかで順番に巡回して行くんですかね。
HANDLE hFind = FindFirstFile(C:\\*,&wfd);
while (true)
{
if (FindNextFile(hFind,&wfd) == 0)
}
書き途中で送っちゃいました。
HANDLE hFind = FindFirstFile(C:\\*,&wfd);
while (true)
{
// ここで配列に入れるなりして下さい。
if (FindNextFile(hFind,&wfd) == 0)
{
break;
}
}
だいたいこんな感じです。エラー処理無しなんで実際はもう少し複雑ですが。
HELPを見るとwfdの中に
ファイル情報が入っているということらしいのですが
どうやってその情報を抜き出したらよいのかわかりません。
教えてください。
すいません。一個上の内容はできましたが、
これだと多分、一階層分のフォルダしか検索しないのではないでしょうか?
もしその下のフォルダ内のフォルダ及びファイルを延々と調べたい時は、
どうしたらよいですか?
宜しくお願いします。
えっととりあえず
wfd.cFileNameにファイル名(絶対パスでは無い)が入っています。
これを検索対象のディレクトリ名と結合します。
そうすると絶対パスになります。サンプルコードは...
void Func(char* pDir)
{
char szBuf[256] = ";
wsprintf(szBuf,%s*,szDir);
WIN32_FIND_DATA wfd = { 0 };
HANDLE hFind = FindFirstFile(szBuf,&wfd);
while (hFind != INVALID_HANDLE_VALUE)
{
wsprintf(szBuf,%s%s,pDir,wfd.cFileName);
// ここでいろんな処理をする
if (FindNextFile(hFind,&wfd) == 0)
{
break;
}
}
FindClose(hFind);
}
int main()
{
Func(C:\\);
return 0;
}
とまあこんなもんです。サンプルコードは適当なんであまり信じないように(笑)
どうも、はじめまして コキンと申します。
私も初心者であまり詳しいことはわかりませんが、
私は、あるフォルダを走査する関数を作ってそれを再帰的に
呼び出して実装してみました。
結構前にやったんで、細部はもうわかりませんが…
とりあえずそんな感じでやってみては?
(もっといい方法あったらすいません。)
例えば、最下層まで取得したいんなら再起がいると思うんですけど質問が
> あるフォルダを指定した時、その中にあるすべてのフォルダ及びファイル
ということであえて再起にはしませんでした。
上に書いたサンプルコードの
// ここでいろんな処理をする
の部分に
if (wfd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
{
Func(szBuf);
}
// ここでいろんな処理をする
という風に書きかえれば再起になると思います。
やはり再帰を使うしかないのですね。
そうすると今度は、ファイルとフォルダを判定しなければならないのですが
dwFileAttributes FILE_ATTRIBUTE_DIRECTORY
と関係があるのでしょうか?
それとも別に関数があるのですか?
最終手段はopen関数を使用して、
開いたらファイル、エラーならフォルダとしてもいいのですが、
非常に重いような気がするので、何かいい方法を教えてください。
>そうすると今度は、ファイルとフォルダを判定しなければならないのですが
>dwFileAttributes FILE_ATTRIBUTE_DIRECTORY
>と関係があるのでしょうか?
関係あるというかそのまんまなんですけど。
MSDNを調べたりしたんでしょうか?
「再帰」を理解されているくらいのスキルがあるはずなのに、それくらい調べられないということはないですよね(いや、嫌味とかではなく)?
ひとつひとつ事細かに質問していたら時間がかかって仕方ないし、なによりTOTOさんのためになるとも思えません。
自分で調べてみて、それでもなお理解できないというときに質問するのは構わないと思います。
それとディレクトリかどうかの判定については
if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
にすべきかと思います。
読み取り専用のフラグ(FILE_ATTRIBUTE_READONLY)などが立っていたりしますからね。
たしかに複数指定可って書いてありますね。
それと気付いたんですけど
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
Func(lstrcat(szBuf,\\));
}
こうしないとダメっぽいですね。
>CdSさん
ご指摘ごもっともです。
wfd.dwFileAttributesになんか入っているということはなんとなくわかったのですが、
HELPが英語で書いてあり確信が持てず、
FILE_ATTRIBUTE_DIRECTORYをどうやって使用していいのかがわからなかったのです。
こういう風に使用すればいいのですね。
ありがとうございます。
toruさん、kokin さんありがとうございました。
今後とも宜しくお願いします。
すいませんtoruさん。
前のほうに書いてあったの見てませんでした。
見たと思うんですけど、素通りしてました。
お手数をおかけしました。
あと、ちなみに
このままの関数だと、いらないフォルダー(. , ..フォルダ)まで拾ってくるので
なんかで判定かけて取り除いたほうがいいですよ。
教えてもらって何なんですけど……。
ちなみに自分は、文字列判定かけました。
他に何かあればまた教えてください。