環境パスを使用して完全修飾されていないファイルを見つけるにはどうすればよいですか?
-
07-07-2019 - |
質問
" 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;
}
}
所属していません StackOverflow