Wie finde ich eine Datei, die nicht voll qualifiziert werden kann, den Umgebungspfad durch den Einsatz?
-
07-07-2019 - |
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?
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;
}
}