如何使用环境路径查找可能未完全限定的文件?

Posted

技术标签:

【中文标题】如何使用环境路径查找可能未完全限定的文件?【英文标题】:How do I find a file that may not be fully-qualified by using the environment path? 【发布时间】:2010-11-28 14:45:36 【问题描述】:

我有一个可执行文件名,例如“cmd.exe”,需要解析它的完全限定路径。我知道 exe 出现在 PATH 环境变量中列出的目录之一中。有没有办法在不解析和测试 PATH 变量中的每个目录的情况下解析完整路径?基本上我不想这样做:

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

一定有更好的方法,对吧?

【问题讨论】:

【参考方案1】:

嗯,我确实找到了以下内容;但是,我想我会坚持托管实施。

    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;
        
    

【讨论】:

【参考方案2】:

这是另一种方法:

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() 方法使用的字符串。

【讨论】:

【参考方案3】:

你可以用 Linq 它

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

也许更易读一点?

【讨论】:

我相信你需要正确构造路径才能调用File.Exists。 File.Exists(Path.Combine(p, filename))【参考方案4】:

这似乎已经是一种很好的方法了——据我所知,搜索PATH 环境变量中的目录是Windows 在尝试解析路径时所做的事情。

【讨论】:

以上是关于如何使用环境路径查找可能未完全限定的文件?的主要内容,如果未能解决你的问题,请参考以下文章

[环境配置][C++]ceres编译提示超过 OS 最大路径限制。完全限定的文件名必须少于 260 个字符

TypeScript Compiler API:如何在没有绝对路径的情况下获取类型的完全限定名称?

如何使用 IntelliJ IDEA 查找所有未使用的代码?

c#中怎么获得当前路径

asp.net中Server.MapPath是啥意思?

如何查找opencv4tegra 的安装路径