フォルダーの判別方法 – プログラミング – Home

通知
すべてクリア

フォルダーの判別方法


コウタ
 コウタ
(@コウタ)
ゲスト
結合: 15年前
投稿: 2
Topic starter  

Visual Studio 2003 + COM(Shell)です。

エクスプローラーのようなリストコントロールを作りたいと思っています。

リストコントロールは常に詳細表示で、ヘッダーは名前、サイズ、更新日時の3つに固定
したいと思っています。

IShellFolder.GetDetailsOf()に0、1、3を渡して情報を取得しようと思っていますが、
通常のフォルダー以外がリストコントロールに表示されていた場合は、違う情報が取得
されてしまいます。

例)
ごみ箱:名前、元の場所、サイズ
C:\WINDOWS\Fonts:フォント名、ファイル名、更新日時
C:\Documents and Settings\{USER}\Local Settings\History:期間

通常のフォルダーとそれ以外のフォルダーを判別する方法はありますでしょうか?

よろしくお願いします。


引用解決済
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> 通常のフォルダーとそれ以外のフォルダーを判別する方法はありますでしょうか?

難しいと思います。

それより、GetDetailsEx を使ったほうがいいかもしれません。


返信引用
.....
 .....
(@.....)
ゲスト
結合: 15年前
投稿: 16
 

http://www.google.co.jp/search?hl=ja&q=%E7%89%B9%E6%AE%8A%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80+VC&sourceid=navclient-ff&rlz=1B3GGGL_jaJP290JP290&ie=UTF-8

検索すると、いろいろと見つかります。
結構大変ですけど。。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 18年前
投稿: 381
 

IShellFolder::GetAttributesOf で取得した属性に
SFGAO_FILESYSTEM が含まれていればシステムファイル or フォルダーで、
このうちさらに SFGAO_FOLDER を含むものがシステムフォルダーとして
取得できたように思います。

MSDN には SFGAO_FILESYSTEM はファイルシステムの一部という説明くらいしか
ないので、このフラグが厳密にシステムファイル or フォルダーだけを
指すかどうかまでは検証してませんが、通常のフォルダーとそれ以外という
判断にはなりそうです。


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

> subaru さん

たとえば、C:\Windows\Fonts は物理的なディレクトリとしても存在しているので、そこ
から「特殊フォルダではなく、物理的なディレクトリとしての側面を表す
IShellFolder を取得」みたいなことができないと難しいだろうな、と思います。

# ちなみに、俺は
#  ディレクトリ=ファイルのコンテナとしてファイルシステム上に存在するもの
#  フォルダ=IShellFolder を実装する仮想的なシェルオブジェクトのコンテナ
# として意図的に区別しています(ファイルはディレクトリを包含する)。


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

まちがい。

> (ファイルはディレクトリを包含する)。

正しくは「フォルダはディレクトリを包含する」です。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 18年前
投稿: 381
 

>たとえば、C:\Windows\Fonts は物理的なディレクトリとしても存在しているので、そこ
>から「特殊フォルダではなく、物理的なディレクトリとしての側面を表す
>IShellFolder を取得」みたいなことができないと難しいだろうな、と思います。

なるほど。そこまで深読みしてませんでした。
確かに SHGetSpecialFolderLocation に CSIDL_FONTS を指定して取得した
PIDL から BindToObject した場合と、
C:\Windows\Fonts というパスから作成した PIDL から BindToObject した場合で、
列挙されたファイルへの GetDetailsOf の結果が異なってきますね。

そもそも私の回答は、列挙されたフォルダーの内容の判断で
バインドする PIDL の方ではなかったので質問の意図を取違えていたようです。


返信引用
コウタ
 コウタ
(@コウタ)
ゲスト
結合: 15年前
投稿: 2
Topic starter  

aetosさん、.....さん、subaruさん、レスありがとうございます。

返信が遅くなり、申し訳ございませんでした。

やはり難しそうですね。

GetAttributesOf()でいろいろなフォルダーの
SFGAO_系を取得してみたのですが、判別は不可能でした。。。

GetDetailsOf()で、デスクトップフォルダーのヘッダー数をあらかじめ取得しておき、
そのヘッダー数と同じかどうかで判別しようかなぁと思ったり思わなかったりです。

ただ、処理が多少重くなりそうなので、迷っています。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 18年前
投稿: 381
 

IShellFolder2::MapColumnToSCID でヘッダーの並び順を調べるって
手もありそうですが。。。
目的にもよりますが、aetos さんが提案されている GetDetailsEx を使えば
ヘッダーの並び順に関わらず全ての項目を同じように表示することができます。
(表示できない項目は GetDetailsEx がエラーを返すだけです)


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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