特定のフォルダの中身のすべてのファイルのファイル名を取得するには
どうすればいいですか?
そのような処理のことを、ファイルの「列挙」と言います。
また、「FindFirstFile」という API を使います(他にも使いますが)。
このへんをキーワードに検索すると、サンプルがごろごろ出てきます。
現在、↓のようなことになっていて、とりあえずファイル名の取得は出来たのですが、
大半のファイル名が文字化け(?)したように表示されます。
hd=FindFirstFileA("*?.???",(WIN32_FIND_DATAA*)&wfd);
file=wfd.cFileName;
MessageBox(hWnd,file,"test",MB_OK);
何が原因なのでしょうか?
よろしくお願いします。
すいません。記入漏れがありました。
&wfdはWIN32_FIND_DATA構造体のポインタです。
wfd が何かより、file が何なのかの方が気になるところではあるんですが。
ところで、処理はそれだけですか?
その前後もあるなら載せてください。変数の宣言とか、後処理とか。
あるべきコードがないように思えますので。
変数は、
TCHAR *file;
HANDLE hd;
で定義してあって処理はWM_CREATEが発行されたときに行っています。
後処理は
WM_CLOSEが発行されたときに
FindClose(hd);
を実行しています。
文字化けなどのように見える場合は、確保したメモリ領域が参照前に破壊されてしまっている場合が多いです。
自動変数のスコープ、変数の初期化、バッファオーバーフローなどを疑ってみるといいかもしれません。
また、TCHAR などと ANSI な定義の直指定を混在させることは避けたほうがいいと思います。
パっとみた限りではマズい所は見つからず。
HANDLE hd は static ですよね? static じゃなくてもリークするだけで文字化けの理由にゃならんけど。
検索したいファイル名と、実際に得られるファイル名はどんな感じなんでしょう?
hdはstaticではなく、グローバル変数です。
ファイル名は、特にこれというのではなく、フォルダの中身を取得するためなので、
ワイルドカードを使用しています。
もしかして文字化けって
拡張子を除いたファイル名の最後に"~1"がついていませんか?
実際にそのフォルダにあるファイル名と、検索で得られたファイル名について
出してもらえますでしょうか。
直接の原因がわかんないので、思いつくところを片っ端から指摘。
まさかとは思いますが、#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 のトコとか。
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 " 等といったわけの分からない文字列が出てきます。
単に,FindFirstFileに失敗しただけでは?
どうにかいろいろやった結果解決しました。
どうやら相対パスの指定で、/ではなく\を使ったのががいけなかったようです。
ありがとうございました。
> どうやら相対パスの指定で、/ではなく\を使ったのががいけなかったようです。
ソース中に
hd=FindFirstFile("..\..\..\*",&wfd);
と記述したというコトでしょうか?
正しくは
hd=FindFirstFile("..\\..\\..\\*",&wfd);
になるハズですが。
>hd=FindFirstFile("..\\..\\..\\*",&wfd);になるハズですが。
見事に\の記述を間違っていました。
こんな些細なことが原因だったとは・・・
毎度お騒がせしましたm(--)m
ツイート | ![]() |