.NET FrameworkのSystem.Envrionment.SpecialFolder列挙体の話です。

Desktop と DesktopDirectory – Life like a clown

結局のところ,この 2 つの値(を指定して GetFolderPath() を実行した結果)は以下のような振る舞いをするようです.

  • DesktopDirectory は,現在の環境のデスクトップフォルダのパスを返す
  • Desktop は,%USERPROFILE%\デスクトップ と言う値を返す.ただし,この値に相当するパス(, ジャンクション, etc?)が存在しない場合は空文字を返す.

Desktop を指定した時に返る値もどこかを設定すれば変更できそうな気はするのですが,今のところよく分かってません.デスクトップフォルダのパスを取得すると言うサンプルコードを探すと,結構な頻度で Desktop の方を指定したものが引っかかりますが,上記のような挙動を考えると DesktopDirectory を指定する方が良さそうです.

私もSpecialFolder.DesktopDirectoryを使うのがよいと思います。それを元の記事とは別の観点から書いていきます。


結局、DesktopとDesktopDirectoryの違いは、Windows APIの世界の話になります。

MSDNライブラリのEnvironment.SpecialFolder列挙体の解説にこんな記述があります。

特別なフォルダーの詳細については、CSIDL値のトピックを参照してください。

実は、Environment.SpecialFolderの各値はCSIDLの各定数と同じ値を持っているのです。そのため、CSIDL定数群の説明が当てはまると考えて良いと思います。

CSIDL (Windows) – MSDN Library(日本語は私訳)
CSIDL_DESKTOP
The virtual folder that represents the Windows desktop, the root of the namespace.
Windowsのデスクトップ、名前空間のルートを表すフォルダ。
CSIDL_DESKTOPDIRECTORY
The file system directory used to physically store file objects on the desktop (not to be confused with the desktop folder itself). A typical path is C:\Documents and Settings\username\Desktop.
デスクトップ上に置かれた物理的なファイルシステムオブジェクトを保管するために用いるファイルシステム上のディレクトリ。

Windowsのシェル(shell32.dll)の世界では、デスクトップを頂点(ルート)とする単一のツリー構造でファイル階層を表現しています。それをシェル名前空間と呼びます。ここでは、C:\などのディスクドライブのルートディレクトリもマイコンピュータに属するフォルダという扱いです。Windowsエクスプローラのフォルダツリーはまさにそれを表現しています。

Windowsエクスプローラのフォルダ表示における「デスクトップ」を起点とした階層構造の様子

エクスプローラでのフォルダ階層のツリー表示

この頂点たる「デスクトップ」を指すのがCSIDL_DESKTOP, SpecialFolder.Desktopです。そして、デスクトップに作成したファイルやフォルダの保存先となるディレクトリを表すのがCSIDL_DESKTOPDIRECTORY, SpecialFolder.DesktopDirectoryであると私は理解しています。

結論として、デスクトップフォルダのファイルパスを取得するという目的であれば、SpecialFolder.DesktopDirectoryを用いるのが適切であると私は考えています。ただし、ファイルパスではなく、シェル名前空間上で作業するなら、SpecialFolder.Desktopを用いるのが適切だと思います(.NET FrameworkのAPIにシェル名前空間に対するものは用意されていないですけどね)。

そういえば、CSIDL_COMMON_DESKTOPDIRECTORY, SpecialFolder.CommonDesktopDirectoryに言及するのを忘れていました。これも機会があれば、というよりシェルについて書く気が起こったら、ですね。


スポンサード リンク

この記事のカテゴリ

  • ⇒ Environment.SpecialFolderとCSIDL
  • ⇒ Environment.SpecialFolderとCSIDL