Domanda

Ho un nome eseguibile, come " cmd.exe " e deve risolvere il suo percorso completo. So che l'exe appare in una delle directory elencate nella variabile d'ambiente PATH. C'è un modo per risolvere il percorso completo senza analizzare e testare ogni directory nella variabile PATH? in pratica non voglio farlo:

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

Deve esserci un modo migliore, giusto?

È stato utile?

Soluzione

Sembra un buon modo per farlo già - per quanto ne so, la ricerca tra le directory nella variabile d'ambiente PATH è comunque ciò che fa Windows quando cerca di risolvere un percorso .

Altri suggerimenti

Ecco un altro approccio:

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

Risultato: C: \ WINDOWS \ system32

La chiamata Path.Combine () viene utilizzata per gestire i percorsi che non terminano con una barra finale. Ciò concatenerà correttamente le stringhe da utilizzare con il metodo File.Exists ().

Potresti Linq con

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

Forse un po 'più leggibile?

Dan

Bene, ho trovato quanto segue; tuttavia, penso che mi atterrò all'implementazione gestita.

    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;
        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top