ファイルの列挙について – プログラミング – Home

ファイルの列挙について
 
通知
すべてクリア

[解決済] ファイルの列挙について


竹下
 竹下
(@竹下)
ゲスト
結合: 20年前
投稿: 7
Topic starter  

前提:
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する方
法を教えてください。お願いします。


引用未解決
トピックタグ
竹下
 竹下
(@竹下)
ゲスト
結合: 20年前
投稿: 7
Topic starter  

追記:
FindFirstFile, FindNextFileで不可能であれば、WinAPI SDK OnlyでDefault Exploreで
表示されるファイルおよびフォルダのみを抜き取る方法をお教えください。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

回答ではありませんが、以下の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)))


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

WIN32_FIND_DATAのファイル属性は、「発見されたファイルの属性」なので
あって、「見つけるときのフィルター」ではありません。従って何を指定
しても無視されます。

見つかったファイルのファイル属性を見て「発見ファイル一覧に追加しない」
という判断をする以外にはなさそうですね。
これは、~Ex()を使っても事情はあまり変わらないようです。

ちなみに、Exploreのフィルター設定値は、どっかのレジストリに書いてあると
思いますが、詳しくは知りません。ウィルスに狙われやすいデータなので、
OSによっては隠蔽されているかもしれません。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

提示されたコードが断片的なので仲澤@失業者さんの指摘が当たっているのか
それとも他の部分に問題があるのかがわかりません。

仲澤@失業者さんの指摘が的を得ているならそのようにコードを修正するだけ
なのですが、もしそうでないなら自分が書いたコードを処理内容がわかるように
提示しないと適切なレスは期待できないと思いますよ。

試しに上記の判断文を用いて検索した結果を振り分けて見ましたが、
普通に振り分けは出来ました。
なので判断文のその物は問題無いと思います。

FindFisrtFileとFindNextFileを使った検索処理は
割とベーシックな課題だと思います。
じっくり取り組んで何処がまずくてうまく行っていないのかを
勉強しましょう。
どうも文章からすると課題として取り組んでいるようなので
正解を教えてもらうよりもヒントをもらって自分で解決した方が
身に付くと思いますよ。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

エクスプローラの表示ルールを再現したいなら、FindFirstFile ではなく
IShellFolder::EnumObjects を使うのがいいと思います。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

IShellFolder::EnumObjects は課題としては難易度が高いかもしれませんね。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

> エクスプローラの表示ルールを再現したいなら、FindFirstFile ではなく

結局、課題として何が求められているのかが問題ですね。
エクスプローラの表示状態を再現する事が目的なのか
隠しファイルとシステムファイルを非表示にしたいだけなのかで
話は変わってくると思います。


返信引用
竹下
 竹下
(@竹下)
ゲスト
結合: 20年前
投稿: 7
Topic starter  

なるほど。やっぱりFind...系ではだめなようですね。
再帰的呼び出しを用いて、すべてのファイルを列挙することはできたのですが、あまり
に多くてDefaultのExploreに出てくる奴だけを相手にプログラミングしたいと思ってい
たのです。
EnumObjectsですか。知りませんでした。
http://www.kab-studio.biz/Programing/Codian/ShellExtension/05.html
に大まかなやり方が書いてありました。

あと、ビット演算の基礎がおろそかだったみたいですね。bunさんのコードを見て、あ、
なるほどエレガントだと思いました。実行速度もおそらく速いでしょう(今回はそこま
でシビアな要求はありませんが)。

皆さんありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました