フォルダ内のすべてのフォルダとファイル – プログラミング – Home

フォルダ内のすべてのフォルダとファイル
 
通知
すべてクリア

[解決済] フォルダ内のすべてのフォルダとファイル


TOTO
 TOTO
(@TOTO)
ゲスト
結合: 24年前
投稿: 29
Topic starter  

CでもC++でもいいのですが、
あるフォルダを指定した時、その中にあるすべてのフォルダ及びファイル
の絶対パスを調べるにはどうしたらよいですか?
自分としては、どこぞの配列に入っているとうれしいのですが。
教えてください。
宜しくお願いします。


引用未解決
トピックタグ
toru
 toru
(@toru)
ゲスト
結合: 23年前
投稿: 15
 

FindFirstFile()とかで順番に巡回して行くんですかね。

HANDLE hFind = FindFirstFile(C:\\*,&wfd);

while (true)
{
if (FindNextFile(hFind,&wfd) == 0)

}


返信引用
toru
 toru
(@toru)
ゲスト
結合: 23年前
投稿: 15
 

書き途中で送っちゃいました。

HANDLE hFind = FindFirstFile(C:\\*,&wfd);

while (true)
{
// ここで配列に入れるなりして下さい。

if (FindNextFile(hFind,&wfd) == 0)
{
break;
}
}

だいたいこんな感じです。エラー処理無しなんで実際はもう少し複雑ですが。


返信引用
TOTO
 TOTO
(@TOTO)
ゲスト
結合: 24年前
投稿: 29
Topic starter  

HELPを見るとwfdの中に
ファイル情報が入っているということらしいのですが
どうやってその情報を抜き出したらよいのかわかりません。
教えてください。


返信引用
TOTO
 TOTO
(@TOTO)
ゲスト
結合: 24年前
投稿: 29
Topic starter  

すいません。一個上の内容はできましたが、
これだと多分、一階層分のフォルダしか検索しないのではないでしょうか?
もしその下のフォルダ内のフォルダ及びファイルを延々と調べたい時は、
どうしたらよいですか?
宜しくお願いします。


返信引用
toru
 toru
(@toru)
ゲスト
結合: 24年前
投稿: 48
 

えっととりあえず

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;
}

とまあこんなもんです。サンプルコードは適当なんであまり信じないように(笑)


返信引用
kokin
 kokin
(@kokin)
ゲスト
結合: 23年前
投稿: 7
 

 どうも、はじめまして コキンと申します。

私も初心者であまり詳しいことはわかりませんが、
私は、あるフォルダを走査する関数を作ってそれを再帰的に
呼び出して実装してみました。

 結構前にやったんで、細部はもうわかりませんが…
とりあえずそんな感じでやってみては?
 
(もっといい方法あったらすいません。)


返信引用
toru
 toru
(@toru)
ゲスト
結合: 24年前
投稿: 48
 

例えば、最下層まで取得したいんなら再起がいると思うんですけど質問が

> あるフォルダを指定した時、その中にあるすべてのフォルダ及びファイル

ということであえて再起にはしませんでした。
上に書いたサンプルコードの

// ここでいろんな処理をする

の部分に

if (wfd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
{
Func(szBuf);
}
// ここでいろんな処理をする

という風に書きかえれば再起になると思います。


返信引用
TOTO
 TOTO
(@TOTO)
ゲスト
結合: 24年前
投稿: 29
Topic starter  

やはり再帰を使うしかないのですね。
そうすると今度は、ファイルとフォルダを判定しなければならないのですが
dwFileAttributes FILE_ATTRIBUTE_DIRECTORY
と関係があるのでしょうか?
それとも別に関数があるのですか?
最終手段はopen関数を使用して、
開いたらファイル、エラーならフォルダとしてもいいのですが、
非常に重いような気がするので、何かいい方法を教えてください。


返信引用
CdS
 CdS
(@CdS)
ゲスト
結合: 24年前
投稿: 176
 

>そうすると今度は、ファイルとフォルダを判定しなければならないのですが
>dwFileAttributes FILE_ATTRIBUTE_DIRECTORY
>と関係があるのでしょうか?

関係あるというかそのまんまなんですけど。
MSDNを調べたりしたんでしょうか?

「再帰」を理解されているくらいのスキルがあるはずなのに、それくらい調べられないということはないですよね(いや、嫌味とかではなく)?
ひとつひとつ事細かに質問していたら時間がかかって仕方ないし、なによりTOTOさんのためになるとも思えません。
自分で調べてみて、それでもなお理解できないというときに質問するのは構わないと思います。

それとディレクトリかどうかの判定については

if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)

にすべきかと思います。
読み取り専用のフラグ(FILE_ATTRIBUTE_READONLY)などが立っていたりしますからね。


返信引用
toru
 toru
(@toru)
ゲスト
結合: 24年前
投稿: 48
 

たしかに複数指定可って書いてありますね。

それと気付いたんですけど

if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
Func(lstrcat(szBuf,\\));
}

こうしないとダメっぽいですね。


返信引用
TOTO
 TOTO
(@TOTO)
ゲスト
結合: 24年前
投稿: 29
Topic starter  

>CdSさん
ご指摘ごもっともです。
wfd.dwFileAttributesになんか入っているということはなんとなくわかったのですが、
HELPが英語で書いてあり確信が持てず、
FILE_ATTRIBUTE_DIRECTORYをどうやって使用していいのかがわからなかったのです。
こういう風に使用すればいいのですね。
ありがとうございます。

toruさん、kokin さんありがとうございました。
今後とも宜しくお願いします。


返信引用
TOTO
 TOTO
(@TOTO)
ゲスト
結合: 24年前
投稿: 29
Topic starter  

すいませんtoruさん。
前のほうに書いてあったの見てませんでした。
見たと思うんですけど、素通りしてました。
お手数をおかけしました。
あと、ちなみに
このままの関数だと、いらないフォルダー(. , ..フォルダ)まで拾ってくるので
なんかで判定かけて取り除いたほうがいいですよ。
教えてもらって何なんですけど……。
ちなみに自分は、文字列判定かけました。
他に何かあればまた教えてください。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました