フォルダをドラッグして中の全ファイル名を取得したい

解決


haru  2006-06-15 05:44:49  No: 62179

こんばんは
ダイアログベースのプログラムにフォルダをドラッグ(&ドロップ)して
そのフォルダ内のファイル名(と個数)を全て取得したいのですが
どうすれば良いのでしょうか?

今のところファイルのドラッグに関しては
DragQueryFile関数を使用して取得に成功したのですが、
同じようにフォルダをドラッグすると
フォルダを一つのファイルとして扱うようでうまくいきません。
現在のソースはこんな感じです。

--------------------------------------------------------------------
unsigned int szPath;
char fPath[MAX_PATH + 1];


// ドラッグされたファイル数
unsigned int fcount = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);


// パス名取得
szPath = DragQueryFile(hDropInfo, 0, fPath, MAX_PATH + 1);
m_ed1.SetWindowText(fPath);
--------------------------------------------------------------------

何か別のアプローチが必要なんでしょうか?
よろしくお願いします。

私の環境は
OS WindowsXP
VC++ 6.0
です。


dairygoods  2006-06-15 06:27:02  No: 62180

その後、CFindFile を使って、
ディレクトリの中のファイルを列挙すればよいです。

http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_CFileFind.html


瀬戸っぷ  2006-06-15 09:49:07  No: 62181

Win32APIだとFindFirstFile()〜FindNextFile()〜FindClose()です。

"."と".."というディレクトリが引っかかると思いますが、
適宜無視するようにしてください。

あと…
> unsigned int szPath;
szって付けるのは止めた方がいいです。

# って書いてからMFCだって気づいた。
# まぁ、ツッコミはあるので投稿。


REE  2006-06-15 19:48:36  No: 62182

szPathのszはsizeの略のつもりかと思います。
ただszのプリフィックスは「NULLで終わる文字列」ととられてしまうことがあります。

ちなみにfPathのfも(file or fullの略のつもりでしょうが)float型ととられてしまうことことがあります。

# 参考:ハンガリアン記法


haru  2006-06-15 20:40:29  No: 62183

dairygoodsさん、瀬戸っぷさん、REEさんありがとうございます。

>szPathのszはsizeの略のつもりかと思います。
>ただszのプリフィックスは「NULLで終わる文字列」ととられてしまうことがあります。

たしかにsizeの略のつもりでした。
そんな決まりごとがあるとは知りませんでした。
気をつけます。

CFindFileを使ってファイルを検索する方法は
いろいろ調べて見当がつきました。ありがとうございます。
が、そもそもドラッグしたものがファイルなのかディレクトリなのかが
わからないことに気づきました。
JavaにはisFileという便利な関数があるみたいですが、
VC++にも同じような機能があるんでしょうか?
それともパス名に"."があるかどうかで判別するしかないのでしょうか?

よろしくお願いします。


通りすがり  2006-06-15 20:54:19  No: 62184

PathIsDirectoryとか


YuO  2006-06-15 20:55:22  No: 62185

> が、そもそもドラッグしたものがファイルなのかディレクトリなのかが
> わからないことに気づきました。
> JavaにはisFileという便利な関数があるみたいですが、
> VC++にも同じような機能があるんでしょうか?

APIを使うのが一番手っ取り早いでしょう。
http://msdn.microsoft.com/library/en-us/fileio/fs/getfileattributes.asp

> それともパス名に"."があるかどうかで判別するしかないのでしょうか?

.を含むディレクトリは存在しうるので,それは判別の方法にはなり得ません。


haru  2006-06-15 22:37:29  No: 62186

通りすがりさん、YuOさんありがとうございます。

GetFileAttributes関数で判別できました。

あとはCFindFileを使って中のファイルを読んでいく作業に
チャレンジします。

また何かわからないことがあったらよろしくお願いします。


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

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






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