【问题标题】: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(';'))
    ...

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

【问题讨论】:

    标签: c# .net environment-variables relative-path path


    【解决方案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 在尝试解析路径时所做的事情。

        【讨论】:

          猜你喜欢
          • 2010-12-19
          • 1970-01-01
          • 2021-06-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-29
          相关资源
          最近更新 更多