我有一个可执行文件名,例如“cmd.exe”。并需要解决它的完全合格的路径。我知道exe出现在PATH环境变量中列出的一个目录中。有没有办法解析完整路径而无需解析和测试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()方法使用的字符串。

你可以用

来实现它
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