我有一个可执行名称,例如“cmd.exe”,需要解析它的完全限定路径。我知道 exe 出现在 PATH 环境变量中列出的目录之一中。有没有办法在不解析和测试 PATH 变量中的每个目录的情况下解析完整路径?基本上我不想这样做:
foreach (string entry in Environment.GetEnvironmentVariable("PATH").Split(';'))
...
必须有更好的方法,对吧?
我有一个可执行名称,例如“cmd.exe”,需要解析它的完全限定路径。我知道 exe 出现在 PATH 环境变量中列出的目录之一中。有没有办法在不解析和测试 PATH 变量中的每个目录的情况下解析完整路径?基本上我不想这样做:
foreach (string entry in Environment.GetEnvironmentVariable("PATH").Split(';'))
...
必须有更好的方法,对吧?
这是另一种方法:
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;
}
}
这似乎是一种很好的方法——据我所知,搜索PATH
环境变量中的目录是 Windows 在尝试解析路径时所做的事情。