|
>>ところで、マイドキュメントは実はフォルダではありません。 > > 言われるまで深く考えてなかったですが、そういえばそうですね。 > ちょっと感動というか、勉強になります。
「デスクトップ」もそうだし、「ネットワーク」フォルダ等々もそうです。 実際には実在するどこかのフォルダの内容を反映しているものもありますが、エクスプローラでの表示と実体のフォルダの位置は一致してなかったりします。
こういうやつも含めて、エクスプローラに表示されているブツはすべて「シェルオブジェクト」と呼ばれる抽象的なブツなんです。
たぶん、現状は Directory.GetFile() とかでファイルを列挙しているんでしょうが、その路線でいくと「エクスプローラの表示や動作、あるいはその両方を忠実に模倣」しようとするといつかどん詰まりになります。
本格的に、エクスプローラが表示しているのと同じファイルアイコンを表示したいなら、Windows SDK で定義されている IShellFolder, IShellIcon などのインターフェースを利用して取得することになります。
ただし、こういったことをやろうとすると COM を扱うことになるので COM に関する基礎知識は必須ですし、「.NET で COM を扱うことの独特の難しさ」についても理解が必要です。
また、Directory.GetFiles() でみつけた個々のファイルに対して、毎回異なるアイコンを作成してツリービューに階層表示していたりすると、いつかメモリ他の資源を食いつぶしてしまいます。
修作ならともかく、リリースものであるならそういった安直な実装は避けるべきでしょう。
エクスプローラは、複数 explorer.exe 間および他アプリケーションと共有できるように、Win32 レベルの ImageList を公開しています。
ファイル/フォルダアイコンの乱造による資源の枯渇を避けるにはこれを使うのが最も有効なんですが、.NET の ImageList は Win32 の ImageList を素直にラップした作りになっていないので、マジメな実装を実現するのが非常に面倒なのが頭の痛いところです。
|