我有一个可执行文件的名称,比如“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(';'))
...
必须有一个更好的办法,对不对?
这似乎是一个很好的做法 - 据我所知,通过搜索PATH
环境变量中的目录是Windows在尝试解析路径时无论怎样做的。
您可以从command line using PowerShell这样做。如果你愿意从C#开始一个进程并解析它的结果,你可以使用这种方法。我不认为这比你已经做的更简单。
这里的另一种方法:
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()方法使用的字符串。
您可以用
string path = Environment
.GetEnvironmentVariable("PATH")
.Split(';')
.FirstOrDefault(p => File.Exists(p + filename));
有点更具可读性也许LINQ呢?
丹
那么,我找到了以下;不过,我想我会坚持托管实施。
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;
}
}
我相信你需要在调用File.Exists之前正确地构造路径。 File.Exists(Path.Combine(p,filename)) – 2015-12-17 16:29:35