Comment trouver un fichier qui peut ne pas être entièrement qualifié en utilisant le chemin de l'environnement?

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

Question

J'ai un nom de fichier exécutable, tel que "cmd.exe". et besoin de résoudre son chemin pleinement qualifié. Je sais que le fichier exe apparaît dans l'un des répertoires répertoriés dans la variable d'environnement PATH. Existe-t-il un moyen de résoudre le chemin complet sans analyser et tester chaque répertoire de la variable PATH? fondamentalement, je ne veux pas faire ceci:

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

Il doit y avoir un meilleur moyen, non?

Était-ce utile?

La solution

Cela semble déjà être un très bon moyen de le faire - pour autant que je sache, la recherche dans les répertoires de la variable d'environnement PATH est ce que Windows fait quand même lorsqu'il tente de résoudre un chemin .

Autres conseils

Voici une autre approche:

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

Résultat: C: \ WINDOWS \ system32

L'appel Path.Combine () est utilisé pour gérer les chemins qui ne se terminent pas par une barre oblique finale. Cela concaténera correctement les chaînes à utiliser par la méthode File.Exists ().

Vous pouvez le Linq avec

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

Un peu plus lisible peut-être?

Dan

Eh bien, j'ai trouvé ce qui suit; Cependant, je pense que je vais m'en tenir à la mise en œuvre gérée.

    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;
        }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top