11

を取得するための最も安全な方法は何ですか:私は次のように動作する必要があることを知っているシステムドライブ

Environment.GetEnvironmentVariable("windir", EnvironmentVariableTarget.Machine) 

この呼び出しで私の問題は、何らかの理由で誰かが「WINDIR」のEnv Varのを削除することを決定した場合ということですこれは動作しません。

システムドライブを入手するためのさらに安全な方法はありますか?

答えて

4

私が実際に誤解していることは、システムドライブが必要だということですが、「windir」を使用するとWindowsフォルダが作成されます。したがって、の安全な方法がWindowsフォルダを取得する必要がある場合は、古いAPI関数GetWindowsDirectoryを使用する必要があります。

ここにはC#用に用意された関数があります。 ;-)

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
    static extern uint GetWindowsDirectory(StringBuilder lpBuffer, uint uSize); 

    private string WindowsDirectory() 
    { 
     uint size = 0; 
     size = GetWindowsDirectory(null, size); 

     StringBuilder sb = new StringBuilder((int)size); 
     GetWindowsDirectory(sb, size); 

     return sb.ToString(); 
    } 

あなたが本当に実行されているWindows上でドライブが必要であれば、あなたはその後

System.IO.Path.GetPathRoot(WindowsDirectory()); 
+0

ねえ、それは私が言ったことです! –

+0

@リチャード:そうですが、具体的な方向を指すのではなく、その機能をどのように使用できるかについてのサンプルを追加しました。 – Oliver

0

SystemDrive

C:\>SET SystemDrive 
SystemDrive=C: 
+0

残念ながら、その方法は、元の風と同じ問題に苦しんでいる(Googleグループ、Win32の、システムAPIを参照してください) ir環境変数 - ユーザは環境から任意に変更または削除できます。 –

8

という環境変数をTheresのこの1つはシステム・ディレクトリ(SYSTEM32)へのパスを返します。

Environment.GetFolderPath(Environment.SpecialFolder.System) 

これを使用すると、環境変数に頼る必要はありません。

+0

GetFolderPathはSHGetFolderPathを内部的に使用しているので、環境変数の恐れがあることに注意してください。 –

17
string windir = Environment.SystemDirectory; // C:\windows\system32 
string windrive = Path.GetPathRoot(Environment.SystemDirectory); // C:\ 

注:このプロパティは内部的にGetSystemDirectory()Win32 APIを使用します。環境変数には依存しません。

1

を呼び出すことができます(任意のスクリプトまたはユーザーがそれらを変更することができます!)の環境変数を読んだことがない
(エクスプローラで使用されるMS内部、)公式方法は、数十年のためのWin32 API FAQは

関連する問題