• The Lost Known Folders

Windowsには、最初からユーザーのデータファイルを置くための「ドキュメント」フォルダや、Windows関連のファイルを置くWindowsフォルダなどが用意されている。これらは、現在のWindowsでは、「Known Folders」(既知のフォルダ)と呼ばれている。

こうしたフォルダは、最初のWindowsから存在していたが、初期のWindowsでは、固定したパスを使い「標準ディレクトリ」と呼んでいた(フォルダの概念はまだ定義されていなかった)。しかし、Windows NTが登場し、32 bitのAPIを共通化するなどの方向性が確立したとき、パスの細かな違い(C:\WindowsとC:\WinNTなど)が問題になった。これを解決するためにWindows 95とWindows NT 4.0に搭載されたのが、CSIDL(constant special item ID list)だ。

CSIDLは、Windowsの標準フォルダの情報をアプリケーションから利用するだけのもので、簡単にいえば、定数と対応したフォルダパスの表である。このため、アプリケーションが勝手に標準フォルダを追加することなどはできず、ユーザーが場所を変更することもできなかった。

Windows Vistaでは、CSIDLを改良して、新しくKNOWNFOLDERIDが導入された。正式にいえば、Known Foldersは、このとき定義された。というのも、Windows Vistaでフォルダが導入され、物理的ディレクトリだけでなく仮想フォルダも含まれるようになったからだ。

Known Foldersでは、サードパーティが専用のフォルダを追加でき、これを標準フォルダと同じように扱えるようになる。また、すべてのKnown Foldersを列挙するなどのAPIが用意された。また、作成や削除時に動作するハンドラーを登録でき、作成、削除をプログラムから行うことが可能になったほか、カスタムのプロパティを追加することもできる。

最大の特徴は、ユーザーが、Known Foldersの場所(フォルダパス)を変更できることだ。Known Foldersのプロパティには、「場所」タブ(写真01)があり、ここでフォルダパスを変更することができる。アプリケーション側は、Known FoldersをKNOWNFOLDERIDでアクセスするため、パスが変わっても問題は起きない。OneDriveのバックアップ機能に、ドキュメントやビデオフォルダをOneDrive側に移動するというものがある。この機能はKnown Foldersの機能を使って実現されている。

  • 写真01: Known Foldersのプロパティには「場所」タブがあり、その場所を移動させることができる

この機能、2018年のWindows 10 Ver.1809で問題を起こした。一部のユーザーは、Known Foldersのパスを変更したとき、ファイルをすべて移さずそのまま残し、空のフォルダから利用を開始することがあった。たとえば、ダウンロードフォルダが大きくなりすぎたので、Dドライブに移動させ、Cドライブのダウンロードフォルダをそのままにした。

Windows 10 Ver.1803でのミスで、移動したKnown Foldersが残るというバグがあり、1809ではこれを削除するコードが入った。しかし、前述のように、わざと元のフォルダを残しているという使い方を考慮しなかったため、旧フォルダを削除してしまうという問題が発生した。Microsoft自身が原因となったWindowsのバグでは最大のものになった。というのも、状態によってはファイルが回復できない場合があったらしい。

さて、Known Folderを示すKNOWNFOLDERID自体は、WindowsのSDKに含まれるKnownFolders.hで定義されているが、ここでの定義は、名前とUUIDのみ。MicrosoftのページにあるKNOWNFOLDERIDに一覧と説明がある。個々のKnown Folderの設定値は以下のレジストリキーの下にある。


HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions

ここにあるUUID形式のキーがそれぞれのKnown Foldersを表す。レジストリエディタで閲覧してもいいが、一覧を見たければPowerShellで


Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\*

とすればよい。

キー以下の名前“Name”がKnown Foldersの名前であり、これは、シェルショートカットとして利用できる。たとえば、コマンドラインから


Explorer.exe shell:RecycleBinFolder

とすれば、ゴミ箱フォルダを開くことができる。

なお、簡易には旧来のCSIDLを使って利用頻度の高い一部のKnown Foldersを開くことができる。Windows VistaでKnown Foldersが導入されたとき、CSIDLは、Known Foldersを開くように改良された。.NETのSystem.EnvironmentクラスにあるSpecialFolder列挙値は、CSIDLとKnown Foldersの名前を保持している。これに“[Environment]::Getfolderpath()”メソッドを適用することで、実際のパスを得ることができる(写真02)。PowerShellからは以下のコマンドを使う。


[System.Enum]::GetValues([System.Environment+SpecialFolder]) | %{[pscustomobject]@{CSLID=$_.value__; Name=$_.ToString(); Path=[Environment]::Getfolderpath($_)} } | Sort-Object Name
  • 写真02: SpecialFolders列挙値には、CSIDLと一部のKnown Foldersの名前が記録されている。この名前に対して、[Environment]::Getfolderpath()メソッドを適用すると、実際のパスを得ることができる

今回のタイトルネタは、コナン・ドイルの「The Lost World」(1912年)である。チャレンジャー教授らが南米のアマゾン流域にある古生物が生き残る「失われた世界」に向かうというストーリー。本作以来、古生物の生き残るような世界を探検するような話は「ロストワールドもの」と表現されるほど、広く読まれた。同作の翻訳は多く、ハヤカワ、創元のどちらからも出版されているほか、何度も映像化されている。