Frage

Ich habe einen ausführbaren Namen, wie „cmd.exe“ und muß es lösen ist vollständig qualifizierter Pfad. Ich weiß, dass die exe in einem der Verzeichnisse erscheint in der Umgebungsvariable PATH aufgelistet. Gibt es eine Möglichkeit den vollständigen Pfad ohne Analyse und Prüfung jedes Verzeichnis in der PATH-Variablen zu lösen? im Grunde will ich nicht, dies zu tun:

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

Es muss ein besserer Weg sein, nicht wahr?

War es hilfreich?

Lösung

Dies scheint ein ziemlich guter Weg, es schon zu tun -. Soweit ich weiß, in der PATH Umgebungsvariable durch die Verzeichnisse der Suche ist, was Windows tut es trotzdem, wenn es versucht, einen Weg zu lösen

Andere Tipps

Hier ist ein weiterer Ansatz:

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

Ergebnis: C: \ WINDOWS \ system32

Die Path.Combine () Aufruf wird verwendet, Pfad zu behandeln, die mit einem Schrägstrich am Ende nicht. Das wird richtig die Saiten verketten, die von den File.Exists verwendet werden () -Methode.

Sie können es Linq mit

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

Ein wenig mehr lesbar vielleicht?

Dan

Nun, ich habe folgende finden; aber ich glaube, ich an die verwaltete Implementierung hafte.

    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;
        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top