Как мне найти файл, который может быть неполным, используя путь к среде?

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

Вопрос

У меня есть исполняемый файл с именем, как "cmd.exe" и нужно, чтобы устранить это полный путь.Я знаю, что exe-файл отображается в одном из каталогов, перечисленных в переменной окружения PATH.Есть ли способ разрешить полный путь без синтаксического анализа и тестирования каждого каталога в переменной PATH?в принципе, я не хочу этого делать:

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

Должен же быть способ получше, верно?

Это было полезно?

Решение

Кажется, это уже довольно хороший способ сделать это - насколько я знаю, поиск по каталогам в переменной окружения PATH - это то, что Windows делает в любом случае, когда пытается найти путь .

Другие советы

Вот еще один подход:

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

Результат: C: \ WINDOWS \ system32

Вызов Path.Combine () используется для обработки путей, которые не заканчиваются косой чертой. Это правильно объединит строки, которые будут использоваться методом File.Exists ().

Вы могли бы связать его с

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

Может быть, немного более читабельно?

Dan

Ну, я нашел следующее; однако, я думаю, что я буду придерживаться управляемой реализации.

    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;
        }
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top