DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

特殊ディレクトリのパスを取得する

EnvironmentクラスGetFolderPathメソッドを使うと、デスクトップ、お気に入り、スタートメニュー、システムディレクトリなどなどの特殊ディレクトリの絶対パスを取得することができます。

使い方は簡単で、取得したいディレクトリを表すEnvironment.SpecialFolder列挙体の値を指定するだけです。

VB.NET
コードを隠すコードを選択
'デスクトップ
Console.WriteLine( _
    System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory))
'結果: C:\Documents and Settings\UserName\デスクトップ

'お気に入り
Console.WriteLine( _
    System.Environment.GetFolderPath(Environment.SpecialFolder.Favorites))
'結果: C:\Documents and Settings\UserName\Favorites

'マイドキュメント
Console.WriteLine( _
    System.Environment.GetFolderPath(Environment.SpecialFolder.Personal))
'結果: C:\Documents and Settings\UserName\My Documents

'スタートメニュー
Console.WriteLine( _
    System.Environment.GetFolderPath(Environment.SpecialFolder.StartMenu))
'結果: C:\Documents and Settings\UserName\スタート メニュー

'ウィンドウズシステムフォルダ
'System.Environment.SystemDirectoryでも可
Console.WriteLine( _
    System.Environment.GetFolderPath(Environment.SpecialFolder.System))
'結果: C:\WINDOWS\System32
C#
コードを隠すコードを選択
//デスクトップ
Console.WriteLine(
    System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory));
//結果: C:\Documents and Settings\UserName\デスクトップ

//お気に入り
Console.WriteLine(
    System.Environment.GetFolderPath(Environment.SpecialFolder.Favorites));
//結果: C:\Documents and Settings\UserName\Favorites

//マイドキュメント
Console.WriteLine(
    System.Environment.GetFolderPath(Environment.SpecialFolder.Personal));
//結果: C:\Documents and Settings\UserName\My Documents

//スタートメニュー
Console.WriteLine(
    System.Environment.GetFolderPath(Environment.SpecialFolder.StartMenu));
//結果: C:\Documents and Settings\UserName\スタート メニュー

//ウィンドウズシステムフォルダ
//System.Environment.SystemDirectoryでも可
Console.WriteLine(
    System.Environment.GetFolderPath(Environment.SpecialFolder.System));
//結果: C:\WINDOWS\System32

Environment.SpecialFolder列挙体のメンバを表にすると、以下のようになります。表の「具体例」は、64bitのWindows 7上で64bitアプリケーション(プロジェクトのプロパティで、[ビルド]-[32ビットの優先]がオフ)を実行した時の例です。

Environment.SpecialFolder列挙体のメンバ 説明 具体例(Windows 7 64bit)
AdminTools ユーザーの管理ツールフォルダ(.NET Framework 4.0以降) C:\Users\UserName\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools
ApplicationData 現在のローミングユーザーのApplication Dataフォルダ C:\Users\UserName\AppData\Roaming
CDBurning CDへの書き込みを待機しているファイルのステージング領域のフォルダ(.NET Framework 4.0以降) C:\Users\UserName\AppData\Local\Microsoft\Windows\Burn\Burn
CommonAdminTools すべてのユーザーの管理ツールフォルダ(.NET Framework 4.0以降) C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools
CommonApplicationData すべてのユーザーのApplication Dataフォルダ C:\ProgramData
CommonDesktopDirectory パブリックのデスクトップフォルダ(.NET Framework 4.0以降) C:\Users\Public\Desktop
CommonDocuments パブリックのドキュメントフォルダ(.NET Framework 4.0以降) C:\Users\Public\Documents
CommonMusic パブリックのミュージックフォルダ(.NET Framework 4.0以降) C:\Users\Public\Music
CommonOemLinks Oem Linksフォルダ(.NET Framework 4.0以降) C:\ProgramData\OEM Links
CommonPictures パブリックのイメージフォルダ(.NET Framework 4.0以降) C:\Users\Public\Pictures
CommonProgramFiles 共有コンポーネントフォルダ。32ビットアプリケーションでは共有コンポーネント(x86)フォルダとなる。 C:\Program Files\Common Files
CommonProgramFilesX86 64ビットシステムの共有コンポーネント(x86)フォルダ。32ビットシステムではCommonProgramFilesと同じ。(.NET Framework 4.0以降) C:\Program Files (x86)\Common Files
CommonPrograms すべてのユーザーの[スタート]メニューのプログラムフォルダ(.NET Framework 4.0以降) C:\ProgramData\Microsoft\Windows\Start Menu\Programs
CommonStartMenu すべてのユーザーの[スタート]メニューフォルダ(.NET Framework 4.0以降) C:\ProgramData\Microsoft\Windows\Start Menu
CommonStartup すべてのユーザーのスタートアップフォルダ(.NET Framework 4.0以降) C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
CommonTemplates すべてのユーザーのテンプレートフォルダ(.NET Framework 4.0以降) C:\ProgramData\Microsoft\Windows\Templates
CommonVideos パブリックのビデオファイルフォルダ(.NET Framework 4.0以降) C:\Users\Public\Videos
Cookies インターネットクッキーのフォルダ
C:\Users\UserName\AppData\Roaming\Microsoft\Windows\Cookies
Desktop デスクトップ(名前空間のルート)を示す仮想フォルダ(.NET Framework 1.1以降) C:\Users\UserName\Desktop
DesktopDirectory 物理的なデスクトップ C:\Users\UserName\Desktop
Favorites お気に入りフォルダ C:\Users\UserName\Favorites
Fonts フォントの仮想フォルダ(.NET Framework 4.0以降) C:\windows\Fonts
History インターネット履歴のフォルダ C:\Users\UserName\AppData\Local\Microsoft\Windows\History
InternetCache 一時インターネットファイルのフォルダ C:\Users\UserName\AppData\Local\Microsoft\Windows\Temporary Internet Files
LocalApplicationData ローカルApplication Dataフォルダ C:\Users\UserName\AppData\Local
LocalizedResources ローカルリソースフォルダ(.NET Framework 4.0以降) C:\windows\resources\0411
MyComputer マイコンピュータ(.NET Framework 1.1以降)
MyDocuments マイドキュメント(.NET Framework 2.0以降) C:\Users\UserName\Documents
MyMusic マイミュージック(.NET Framework 1.1以降) C:\Users\UserName\Music
MyPictures マイピクチャ(.NET Framework 1.1以降) C:\Users\UserName\Pictures
MyVideos マイビデオ(.NET Framework 4.0以降) C:\Users\UserName\Videos
NetworkShortcuts マイネットワークを示す仮想フォルダ(.NET Framework 4.0以降) C:\Users\UserName\AppData\Roaming\Microsoft\Windows\Network Shortcuts
Personal マイドキュメント C:\Users\UserName\Documents
PrinterShortcuts プリンターの仮想フォルダ(.NET Framework 4.0以降) C:\Users\UserName\AppData\Roaming\Microsoft\Windows\Printer Shortcuts
ProgramFiles Program Filesフォルダ。32ビットアプリケーションではProgram Files(x86)フォルダとなる。 C:\Program Files
ProgramFilesX86 64ビットシステムのProgram Files(x86)フォルダ。32ビットシステムではProgramFilesと同じ。(.NET Framework 4.0以降) C:\Program Files (x86)
Programs [スタート]メニューのプログラムフォルダ C:\Users\UserName\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
Recent 最近使用したドキュメントのフォルダ C:\Users\UserName\AppData\Roaming\Microsoft\Windows\Recent
Resources リソースフォルダ(.NET Framework 4.0以降) C:\windows\resources
SendTo [送る]フォルダ C:\Users\UserName\AppData\Roaming\Microsoft\Windows\SendTo
StartMenu [スタート]メニューフォルダ C:\Users\UserName\AppData\Roaming\Microsoft\Windows\Start Menu
Startup スタートアップフォルダ C:\Users\UserName\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
System ウィンドウズシステムフォルダ C:\windows\system32
SystemX86 64ビットシステムのウィンドウズシステム(x86)フォルダ。32ビットシステムではSystemと同じ。(.NET Framework 4.0以降) C:\windows\SysWOW64
Templates テンプレートフォルダ C:\Users\UserName\AppData\Roaming\Microsoft\Windows\Templates
UserProfile ユーザーのプロファイルフォルダ(.NET Framework 4.0以降) C:\Users\UserName
Windows WindowsディレクトリまたはSYSROOT(.NET Framework 4.0以降) C:\windows
補足:システムディレクトリはEnvironment.SystemDirectoryプロパティでも取得できます。また、現在のディレクトリはEnvironment.CurrentDirectoryプロパティで取得します。Windowsディレクトリについては、「Windowsディレクトリを取得する」でも説明しています。一時ファイル名、一時ディレクトリ名の取得に関しては、「一時ファイル名、一時ディレクトリ名を取得する」をご覧ください。
補足:.NET Framework 2.0以降のVB.NETでは、My.Computer.FileSystem.SpecialDirectoriesのプロパティで特殊ディレクトリを取得することもできます。

ディレクトリが存在しなくてもパスを取得する

.NET Framework 3.5までは、Environment.GetFolderPathメソッドは存在するディレクトリのパスしか返さず、存在しないと空の文字列を返しました。.NET Framework 4.0からは、2番目の引数にSpecialFolderOption列挙体の値を指定することで、存在しないパスでも返すようにできます。

SpecialFolderOption.DoNotVerifyを指定すると、ディレクトリの存在を確認せずにパスを返します。SpecialFolderOption.Createを指定すると、ディレクトリが存在しない場合はディレクトリを作成してパスを返します。SpecialFolderOption.Noneを指定すると、今まで通りです。

VB.NET
コードを隠すコードを選択
'CommonOemLinksフォルダが存在しない時は空の文字列を返す(既定)
Console.WriteLine( _
    Environment.GetFolderPath(Environment.SpecialFolder.CommonOemLinks, _
                              Environment.SpecialFolderOption.None))

'CommonOemLinksフォルダが存在しなくてもパスを返す
Console.WriteLine( _
    Environment.GetFolderPath(Environment.SpecialFolder.CommonOemLinks, _
                              Environment.SpecialFolderOption.DoNotVerify))

'CommonOemLinksフォルダが存在しない時は作成して、パスを返す
Console.WriteLine( _
    Environment.GetFolderPath(Environment.SpecialFolder.CommonOemLinks, _
                              Environment.SpecialFolderOption.Create))
C#
コードを隠すコードを選択
//CommonOemLinksフォルダが存在しない時は空の文字列を返す(既定)
Console.WriteLine(
    Environment.GetFolderPath(Environment.SpecialFolder.CommonOemLinks,
        Environment.SpecialFolderOption.None));

//CommonOemLinksフォルダが存在しなくてもパスを返す
Console.WriteLine(
    Environment.GetFolderPath(Environment.SpecialFolder.CommonOemLinks,
        Environment.SpecialFolderOption.DoNotVerify));

//CommonOemLinksフォルダが存在しない時は作成して、パスを返す
Console.WriteLine(
    Environment.GetFolderPath(Environment.SpecialFolder.CommonOemLinks,
        Environment.SpecialFolderOption.Create));
  • 履歴:
  • 2007/1/25 .NET Framework 2.0に関する記述を追加。
  • 2013/6/29 「ディレクトリが存在しなくてもパスを取得する」を追加。.NET Framework 4.0で追加されたSpecialFolderを追記。具体例をWindows 7 64bitに変更。
  • 2016/5/29 アプリケーションが64bitか32bitで、CommonProgramFilesとProgramFilesのパスが変わるという説明を追加。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。