代码之家  ›  专栏  ›  技术社区  ›  csharptest.net

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

  •  4
  • csharptest.net  · 技术社区  · 15 年前

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

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

    必须有更好的方法,对吗?

    4 回复  |  直到 15 年前
        1
  •  1
  •   Donut    15 年前

    这似乎已经是一个很好的方法了——据我所知,在 PATH 环境变量是Windows在尝试解析路径时所做的。

        2
  •  4
  •   Ahmad Mageed    15 年前

    另一种方法是:

    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
  •  2
  •   Daniel Elliott    15 年前

    你可以把它和

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

    可能更易读一点?

        4
  •  2
  •   csharptest.net    15 年前

    好吧,我确实发现了以下内容;但是,我想我将坚持使用托管实现。

        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;
            }
        }