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

Windowsディレクトリを取得する

Windowsディレクトリのパスは、Environment.GetFolderPathメソッドでは取得できません。Windowsディレクトリのパスを取得する方法には、下記のようなものがあります。

環境変数の値を取得する方法

まず考えられるのは、環境変数で定義されている"windir"の値を取得する方法です。環境変数の値を取得するためには、Environment.GetEnvironmentVariableメソッドまたは、Environment.ExpandEnvironmentVariablesメソッドを使用します。

それぞれのメソッドを使ってWindowsディレクトリのパスを取得する例を示します。

VB.NET
コードを隠すコードを選択
Dim windir As String

'GetEnvironmentVariableメソッドによりWindowsディレクトリを取得
windir = System.Environment.GetEnvironmentVariable("windir")
Console.WriteLine(windir)

'ExpandEnvironmentVariablesメソッドによりWindowsディレクトリを取得
windir = System.Environment.ExpandEnvironmentVariables("%windir%")
Console.WriteLine(windir)
C#
コードを隠すコードを選択
string windir;

//GetEnvironmentVariableメソッドによりWindowsディレクトリを取得
windir = 
    System.Environment.GetEnvironmentVariable("windir");
Console.WriteLine(windir);

//ExpandEnvironmentVariablesメソッドによりWindowsディレクトリを取得
windir = 
    System.Environment.ExpandEnvironmentVariables("%windir%");
Console.WriteLine(windir);

システムディレクトリから推測する方法

また、Windowsディレクトリはシステムディレクトリの親ディレクトリであると考えれば、Environment.GetFolderPathメソッドを使って次のようにできます。

VB.NET
コードを隠すコードを選択
'システムディレクトリを取得
Dim sysdir As String = _
    System.Environment.GetFolderPath( _
        System.Environment.SpecialFolder.System)
'Windowsディレクトリを取得
Dim windir As String = _
    System.IO.Path.GetDirectoryName(sysdir)
Console.WriteLine(windir)
C#
コードを隠すコードを選択
//システムディレクトリを取得
string sysdir =
    System.Environment.GetFolderPath(
        System.Environment.SpecialFolder.System);
//Windowsディレクトリを取得
string windir =
    System.IO.Path.GetDirectoryName(sysdir);
Console.WriteLine(windir);

Win32 APIを使用する方法

また、Win32 APIのGetWindowsDirectory 関数を使用する方法もあります。

VB.NET
コードを隠すコードを選択
<DllImport("kernel32", CharSet:=CharSet.Auto)> _
Private Shared Function GetWindowsDirectory( _
    ByVal buffer As String, _
    ByVal length As Integer) As Integer
End Function

'Windowsディレクトリを取得する
Public Shared Function GetWindowsDirectoryPath() As String
    Dim buf As New String(" "c, 260)
    Dim len As Integer = GetWindowsDirectory(buf, 260)
    Return buf.Substring(0, len)
End Function
C#
コードを隠すコードを選択
[DllImport("kernel32", CharSet=CharSet.Auto)]
private static extern uint GetWindowsDirectory(
    string buffer, uint length);

//Windowsディレクトリを取得する
public string GetWindowsDirectoryPath()
{
    string buf = new string(' ', 260);
    uint len = GetWindowsDirectory(buf, 260);
    return buf.Substring(0, (int) len);
}
補足:裏技として、ニュースグループ「microsoft.public.dotnet.languages.vb」では、Environment.GetFolderPathメソッドで直接取得する方法が紹介されています。

この記事によると、Environment.SpecialFolder列挙体のメンバにWindowsディレクトリに相当するものが見つからないため、一見GetFolderPathメソッドではWindowsディレクトリのパスは取得できないように思われますが、次のような方法によりそれが可能になるということです。

VB.NET
コードを隠すコードを選択
Dim windir As String

'Windowsディレクトリを取得
windir = System.Environment.GetFolderPath( _
    CType(&H24, System.Environment.SpecialFolder))
Console.WriteLine(windir)
C#
コードを隠すコードを選択
string windir;

//Windowsディレクトリを取得
windir = 
    System.Environment.GetFolderPath(
        (System.Environment.SpecialFolder) 0x24);
Console.WriteLine(windir);
しかしこの方法は残念ながら私の環境では(.NET Framework 1.1)成功しませんでした。現在はこの方法は使用できないようです。