フォルダの中のファイルの名前を取得するには?

解決


ent  URL  2004-05-02 06:11:17  No: 53561

特定のフォルダの中身のすべてのファイルのファイル名を取得するには
どうすればいいですか?


シャノン  2004-05-02 07:53:21  No: 53562

そのような処理のことを、ファイルの「列挙」と言います。
また、「FindFirstFile」という API を使います(他にも使いますが)。
このへんをキーワードに検索すると、サンプルがごろごろ出てきます。


ent  URL  2004-05-02 21:18:56  No: 53563

現在、↓のようなことになっていて、とりあえずファイル名の取得は出来たのですが、
大半のファイル名が文字化け(?)したように表示されます。

hd=FindFirstFileA("*?.???",(WIN32_FIND_DATAA*)&wfd);
file=wfd.cFileName;
MessageBox(hWnd,file,"test",MB_OK);

何が原因なのでしょうか?
よろしくお願いします。


ent  2004-05-02 21:20:11  No: 53564

すいません。記入漏れがありました。
&wfdはWIN32_FIND_DATA構造体のポインタです。


シャノン  2004-05-02 21:53:38  No: 53565

wfd が何かより、file が何なのかの方が気になるところではあるんですが。
ところで、処理はそれだけですか?
その前後もあるなら載せてください。変数の宣言とか、後処理とか。
あるべきコードがないように思えますので。


ent  2004-05-03 01:38:07  No: 53566

変数は、
TCHAR *file;
HANDLE hd;
で定義してあって処理はWM_CREATEが発行されたときに行っています。
後処理は
WM_CLOSEが発行されたときに
FindClose(hd);
を実行しています。


通りすがり  2004-05-03 03:14:26  No: 53567

文字化けなどのように見える場合は、確保したメモリ領域が参照前に破壊されてしまっている場合が多いです。
自動変数のスコープ、変数の初期化、バッファオーバーフローなどを疑ってみるといいかもしれません。

また、TCHAR などと ANSI な定義の直指定を混在させることは避けたほうがいいと思います。


シャノン  2004-05-03 05:21:15  No: 53568

パっとみた限りではマズい所は見つからず。
HANDLE hd は static ですよね? static じゃなくてもリークするだけで文字化けの理由にゃならんけど。

検索したいファイル名と、実際に得られるファイル名はどんな感じなんでしょう?


ent  URL  2004-05-03 19:38:23  No: 53569

hdはstaticではなく、グローバル変数です。
ファイル名は、特にこれというのではなく、フォルダの中身を取得するためなので、
ワイルドカードを使用しています。


もに  2004-05-03 20:46:52  No: 53570

もしかして文字化けって
拡張子を除いたファイル名の最後に"~1"がついていませんか?

実際にそのフォルダにあるファイル名と、検索で得られたファイル名について
出してもらえますでしょうか。


シャノン  2004-05-03 21:21:05  No: 53571

直接の原因がわかんないので、思いつくところを片っ端から指摘。

まさかとは思いますが、#define UNICODE とか定義してないですよね?
してあったらエラーなり警告なり出ると思いますが…

> FindFirstFileA("*?.???",(WIN32_FIND_DATAA*)&wfd);
「Unicode を使ってるけどこの関数だけは ASCII 版を呼びたいんだ!」とかいうよくわからないこだわりでもない限り、FindFirstFile'A' とか WIN32_FIND_DATA'A' とか、A をつける必要はないです。ついでに WIN32_FIND_DATAA* 型にキャストする必要もまったくないです。
FindFirstFile、WIN32_FIND_DATA、ただの &wfd でおっけーです。

> ワイルドカードを使用しています。
"*?.???"
というワイルドカードでは、すべてのファイルを列挙することはできません。
これは、「ドットの前に1文字以上あり、ドットがあり、ドットの後に3文字ある」という条件です。例えば、「index.html」なんてのはドットの後に4文字あるのでヒットしません。
普通は "*.*" か "*" を使うと思いますが…。

> 拡張子を除いたファイル名の最後に"~1"がついていませんか?
cFileName メンバなのでないと思います。
cAlternateFileName メンバならそうなりますが。

とはいえ、

> 実際にそのフォルダにあるファイル名と、検索で得られたファイル名について出してもらえますでしょうか。
これは賛成です。というか俺の
> 検索したいファイル名と、実際に得られるファイル名はどんな感じなんでしょう?
はそういうつもりで言ったんですが。

できればついでに、WM_CREATE 中でファイルの検索に関わっているソースも全部載せていただけませんか。FindNextFile のトコとか。


ent  URL  2004-05-04 05:49:16  No: 53572

WM_CREATEメッセージがきた際には、↓のような処理をしています。

hd=FindFirstFile("*",&wfd);
file=wfd.cFileName;
MessageBox(hWnd,file,"OK?",MB_OK);
for(i=0;i>5;i++){
FindNextFile(hd,&wfd);
file=wfd.cFileName;
MessageBox(hWnd,file,"OK?",MB_OK);
}

まだ、実験程度なのでfor文での回数など調整していませんが、
プログラムと同じフォルダ(*を指定した場合)を調べた場合は、
正しく取得されるのですが、
別のフォルダ(相対パス指定)を指定すると、(ここではCドライブ"..\..\..\*")
" シu・・・ ・t " 等といったわけの分からない文字列が出てきます。


YuO  2004-05-04 07:59:05  No: 53573

単に,FindFirstFileに失敗しただけでは?


ent  URL  2004-05-05 06:50:43  No: 53574

どうにかいろいろやった結果解決しました。
どうやら相対パスの指定で、/ではなく\を使ったのががいけなかったようです。
ありがとうございました。


瀬戸っぷ  2004-05-05 08:46:51  No: 53575

> どうやら相対パスの指定で、/ではなく\を使ったのががいけなかったようです。

ソース中に
hd=FindFirstFile("..\..\..\*",&wfd);
と記述したというコトでしょうか?
正しくは
hd=FindFirstFile("..\\..\\..\\*",&wfd);
になるハズですが。


ent  URL  2004-05-05 19:09:49  No: 53576

>hd=FindFirstFile("..\\..\\..\\*",&wfd);になるハズですが。
見事に\の記述を間違っていました。
こんな些細なことが原因だったとは・・・
毎度お騒がせしましたm(--)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加