Como faço para encontrar um arquivo que não pode ser totalmente qualificado usando o caminho ambiente?

StackOverflow https://stackoverflow.com/questions/1429633

Pergunta

Eu tenho um nome do executável, como "cmd.exe" e necessidade de resolver seu caminho totalmente qualificado. Eu sei que as aparece exe em um dos diretórios listados na variável de ambiente PATH. Existe uma maneira de resolver o caminho completo sem analisar e testar cada diretório na variável PATH? basicamente, eu não quero fazer isso:

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

Tem que haver uma maneira melhor, certo?

Foi útil?

Solução

Esta parece ser uma boa maneira bonito de fazer isso já -., Tanto quanto eu sei, buscando através dos diretórios na variável de ambiente PATH é o que o Windows faz de qualquer maneira quando se está tentando resolver um caminho

Outras dicas

Aqui está uma outra abordagem:

string exe = "cmd.exe";
string result = Environment.GetEnvironmentVariable("PATH")
    .Split(';')
    .Where(s => File.Exists(Path.Combine(s, exe)))
    .FirstOrDefault();

Resultado: C: \ WINDOWS \ system32

A chamada Path.Combine () é utilizada para processar os caminhos que não terminam com uma barra final. Isto irá concatenar corretamente as cordas para ser usado pelo método File.Exists ().

Você poderia LINQ com

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

Um pouco mais legível, talvez?

Dan

Bem, eu achei o seguinte; no entanto, eu acho que vou ficar com a implementação gerenciada.

    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;
        }
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top