前提:
FindFirstFile,FindNextFileを使って、指定したフォルダ以下のすべてのFileを列挙す
る課題に取り組んでおります。
環境:WindowsXPで言語はC++、WinAPI SDK Onlyで制作しています。
現状:
ファイルを列挙した所、保護されたオペレーティングシステムファイルまで列挙してし
まいます。
WIN32_FIND_DATAのdwFileAttributesで以下のように指定しても列挙されます。
Code一部:
WIN32_FIND_DATA w32fd;
//FindFirstFile,FindNextFileによる処理によりw32fdにデータが格納される
if(((w32fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) != FILE_ATTRIBUTE_HIDDEN)
&& ((w32fd.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) != FILE_ATTRIBUTE_SYSTEM))
{
//保護されたオペレーティングシステムファイルも引っかかる
}
いろいろとdwFileAttributeを試してみましたがdefaultのExploreで表示されるファイル
およびフォルダのみ抜き取ってくることができません。
質問詳細:
DefaultのExploreで表示されるファイルおよびフォルダを上記環境でProgramingする方
法を教えてください。お願いします。
追記:
FindFirstFile, FindNextFileで不可能であれば、WinAPI SDK OnlyでDefault Exploreで
表示されるファイルおよびフォルダのみを抜き取る方法をお教えください。
回答ではありませんが、以下のif文はもっと簡単にできます。
> if(((w32fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) !=
FILE_ATTRIBUTE_HIDDEN)
> && ((w32fd.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) !=
FILE_ATTRIBUTE_SYSTEM))
これで同じ意味です。
if(!(w32fd.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)))
WIN32_FIND_DATAのファイル属性は、「発見されたファイルの属性」なので
あって、「見つけるときのフィルター」ではありません。従って何を指定
しても無視されます。
見つかったファイルのファイル属性を見て「発見ファイル一覧に追加しない」
という判断をする以外にはなさそうですね。
これは、~Ex()を使っても事情はあまり変わらないようです。
ちなみに、Exploreのフィルター設定値は、どっかのレジストリに書いてあると
思いますが、詳しくは知りません。ウィルスに狙われやすいデータなので、
OSによっては隠蔽されているかもしれません。
提示されたコードが断片的なので仲澤@失業者さんの指摘が当たっているのか
それとも他の部分に問題があるのかがわかりません。
仲澤@失業者さんの指摘が的を得ているならそのようにコードを修正するだけ
なのですが、もしそうでないなら自分が書いたコードを処理内容がわかるように
提示しないと適切なレスは期待できないと思いますよ。
試しに上記の判断文を用いて検索した結果を振り分けて見ましたが、
普通に振り分けは出来ました。
なので判断文のその物は問題無いと思います。
FindFisrtFileとFindNextFileを使った検索処理は
割とベーシックな課題だと思います。
じっくり取り組んで何処がまずくてうまく行っていないのかを
勉強しましょう。
どうも文章からすると課題として取り組んでいるようなので
正解を教えてもらうよりもヒントをもらって自分で解決した方が
身に付くと思いますよ。
エクスプローラの表示ルールを再現したいなら、FindFirstFile ではなく
IShellFolder::EnumObjects を使うのがいいと思います。
IShellFolder::EnumObjects は課題としては難易度が高いかもしれませんね。
> エクスプローラの表示ルールを再現したいなら、FindFirstFile ではなく
結局、課題として何が求められているのかが問題ですね。
エクスプローラの表示状態を再現する事が目的なのか
隠しファイルとシステムファイルを非表示にしたいだけなのかで
話は変わってくると思います。
なるほど。やっぱりFind...系ではだめなようですね。
再帰的呼び出しを用いて、すべてのファイルを列挙することはできたのですが、あまり
に多くてDefaultのExploreに出てくる奴だけを相手にプログラミングしたいと思ってい
たのです。
EnumObjectsですか。知りませんでした。
http://www.kab-studio.biz/Programing/Codian/ShellExtension/05.html
に大まかなやり方が書いてありました。
あと、ビット演算の基礎がおろそかだったみたいですね。bunさんのコードを見て、あ、
なるほどエレガントだと思いました。実行速度もおそらく速いでしょう(今回はそこま
でシビアな要求はありませんが)。
皆さんありがとうございました。