こんばんは
ダイアログベースのプログラムにフォルダをドラッグ(&ドロップ)して
そのフォルダ内のファイル名(と個数)を全て取得したいのですが
どうすれば良いのでしょうか?
今のところファイルのドラッグに関しては
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
です。
その後、CFindFile を使って、
ディレクトリの中のファイルを列挙すればよいです。
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_CFileFind.html
Win32APIだとFindFirstFile()〜FindNextFile()〜FindClose()です。
"."と".."というディレクトリが引っかかると思いますが、
適宜無視するようにしてください。
あと…
> unsigned int szPath;
szって付けるのは止めた方がいいです。
# って書いてからMFCだって気づいた。
# まぁ、ツッコミはあるので投稿。
szPathのszはsizeの略のつもりかと思います。
ただszのプリフィックスは「NULLで終わる文字列」ととられてしまうことがあります。
ちなみにfPathのfも(file or fullの略のつもりでしょうが)float型ととられてしまうことことがあります。
# 参考:ハンガリアン記法
dairygoodsさん、瀬戸っぷさん、REEさんありがとうございます。
>szPathのszはsizeの略のつもりかと思います。
>ただszのプリフィックスは「NULLで終わる文字列」ととられてしまうことがあります。
たしかにsizeの略のつもりでした。
そんな決まりごとがあるとは知りませんでした。
気をつけます。
CFindFileを使ってファイルを検索する方法は
いろいろ調べて見当がつきました。ありがとうございます。
が、そもそもドラッグしたものがファイルなのかディレクトリなのかが
わからないことに気づきました。
JavaにはisFileという便利な関数があるみたいですが、
VC++にも同じような機能があるんでしょうか?
それともパス名に"."があるかどうかで判別するしかないのでしょうか?
よろしくお願いします。
PathIsDirectoryとか
> が、そもそもドラッグしたものがファイルなのかディレクトリなのかが
> わからないことに気づきました。
> JavaにはisFileという便利な関数があるみたいですが、
> VC++にも同じような機能があるんでしょうか?
APIを使うのが一番手っ取り早いでしょう。
http://msdn.microsoft.com/library/en-us/fileio/fs/getfileattributes.asp
> それともパス名に"."があるかどうかで判別するしかないのでしょうか?
.を含むディレクトリは存在しうるので,それは判別の方法にはなり得ません。
通りすがりさん、YuOさんありがとうございます。
GetFileAttributes関数で判別できました。
あとはCFindFileを使って中のファイルを読んでいく作業に
チャレンジします。
また何かわからないことがあったらよろしくお願いします。
ツイート | ![]() |