環境パスを使用して完全修飾されていないファイルを見つけるにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1429633

質問

" cmd.exe"などの実行可能ファイル名があります。そしてそれを完全に修飾されたパスで解決する必要があります。 PATH環境変数にリストされているディレクトリの1つにexeが表示されることは知っています。 PATH変数の各ディレクトリを解析およびテストせずにフルパスを解決する方法はありますか?基本的に私はこれをやりたくない:

foreach (string entry in Environment.GetEnvironmentVariable("PATH").Split(';'))
    ...

より良い方法が必要ですよね?

役に立ちましたか?

解決

これはすでにかなり良い方法のように思えます-私の知る限り、 PATH 環境変数のディレクトリを検索することは、パスを解決しようとするときにWindowsが行うことです。

他のヒント

別のアプローチを次に示します。

string exe = "cmd.exe";
string result = Environment.GetEnvironmentVariable("PATH")
    .Split(';')
    .Where(s => File.Exists(Path.Combine(s, exe)))
    .FirstOrDefault();

結果:C:\ WINDOWS \ system32

Path.Combine()呼び出しは、末尾のスラッシュで終わらないパスを処理するために使用されます。これにより、File.Exists()メソッドで使用される文字列が適切に連結されます。

あなたはそれをLinqできます

string path = Environment
                .GetEnvironmentVariable("PATH")
                .Split(';')
                .FirstOrDefault(p => File.Exists(p + filename));

もう少し読みやすいですか?

ダン

まあ、私は次を見つけました。ただし、管理された実装に固執すると思います。

    static class Win32
    {
        [DllImport("shlwapi.dll", CharSet = CharSet.Auto, SetLastError = false)]
        static extern bool PathFindOnPath([MarshalAs(UnmanagedType.LPTStr)] StringBuilder pszFile, IntPtr unused);

        public static bool FindInPath(String pszFile, out String fullPath)
        {
            const int MAX_PATH = 260;
            StringBuilder sb = new StringBuilder(pszFile, MAX_PATH);
            bool found = PathFindOnPath(sb, IntPtr.Zero);
            fullPath = found ? sb.ToString() : null;
            return found;
        }
    }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top