Como faço para encontrar um arquivo que não pode ser totalmente qualificado usando o caminho ambiente?
-
07-07-2019 - |
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?
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;
}
}