2006 年 10 月 15 日 23 時 21 分

ファイルフォルダの特殊化


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


[写真] [写真]


シェル名前空間を拡張するためには、
高度なプログラミングと設定が必要になる。
特に、自分が作成した新しい特殊フォルダを、
名前空間の自由な場所に追加するのは大変である。

そのため Windows には、既存のファイルフォルダを
特殊なフォルダとして機能させるための仕組みがある。
これらのフォルダは、基本的にはファイルフォルダなのだが、
エクスプローラ上で表示すると通常の表示とは異なる。

例えば、フォント、タスク、アセンブリ、
インターネット一時キャッシュ、オフラインフォルダ等だ。

これらは、一見特殊フォルダのように見えるが、
実際はディレクトリそのものであり、
ファイルの表示方法を特別化しているだけである。

これは、シェル名前空間を理解しない、
コマンドプロンプトで表示してみると良く分かる。
例えば、フォントフォルダで試してみよう。

    > dir /w %WINDIR%\Fonts

dir コマンドは、ディレクトリのファイル一覧を出力する。
そこには、「MS Pゴシック」などの表示はなく、
「msgothic.ttc」など、フォントファイルの名前が、
一覧として表示されたはずだ。

つまり、Fonts ディレクトリ配下には、
確かに msgothic.ttc 等のファイルが存在するが、
このフォルダをエクスプローラで表示した場合は、
独自の表示を行うように細工がされているのである。

この細工は、フォルダの読み取り専用属性と、
制御用の desktop.ini ファイルによって行われている。

では、特殊化を解除してみよう。
コマンドプロンプトで、属性を解除してやるだけで、
魔法が解けてただのファイルフォルダに戻る。

    > attrib -s -r %WINDIR%\Fonts

エクスプローラで、Fonts フォルダを開きなおしてみよう。
そこでは、普通にファイルが表示されたことが分かる。

さて、この Fonts フォルダの中には、
「desktop.ini」という設定ファイルがあるはずだ。
これを開いて中身を見てみよう。

なお、このファイルは厳重に隠されているため、
「全てのファイルとフォルダを表示する」かつ、
「保護されたオペレーティングシステムファイルを表示」
という設定にしておかないと表示してくれない。

========== desktop.ini ==========

[.ShellClassInfo]
UICLSID={BD84B380-8CA2-1069-AB1D-08000948F534}

========== end of desktop.ini ==========

[.ShellClassInfo] というセクションは、
ファイルフォルダに対して、特殊な能力を与える。
ここでは、画面表示を担当している COM オブジェクトの
クラス ID (CLSID) を与えていることが分かる。

シェルは、フォルダの属性と desktop.ini の設定を見て、
特別な動作をさせているというわけである。

利用に支障があると困るので元に戻しておこう。

    > attrib +s +r %WINDIR%\Fonts

エクスプローラでの表示は元に戻るはずだ。
これで実際の desktop.ini が消えるわけではないので、
desktop.ini の確認や編集は、いつでも行うことができる。

    > notepad %WINDIR%\Fonts\desktop.ini

MS-DOS の FAT の時代から、ファイルシステムには、
読み取り専用属性、システム属性などの属性があるが、
ディレクトリに対しては、読み取り専用属性を設定しても、
ディレクトリの特性上、意味を持たなかった。

Windows ではその機能を別の用途に利用することにしたのだ。
上記に示したファイルフォルダの特殊化は、
フォルダに読み取り専用か、システム属性が設定され、
desktop.ini の [.ShellClassInfo] セクションで、
制御方法を指定することによって有効になるのである。

Windows XP では、フォルダのアイコンを、
利用者が好きなものに簡単に変えられるが、
これを行うと、フォルダに読み取り専用属性が付き、
desktop.ini が作成されて、アイコンの指定が行われる。
以下のような感じである。

========== desktop.ini ==========

[.ShellClassInfo]
IconFile=%SystemRoot%\system32\SHELL32.dll
IconIndex=13

========== end of desktop.ini ==========

このフォルダの特殊化機能は、
Windows の色々なところで使われているのだ。

今日は「リンク」とは関係ない話だったかも。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.