Как найти файл, который может быть не полностью определен с использованием пути к среде? - PullRequest
4 голосов
/ 16 сентября 2009

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

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

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

Ответы [ 4 ]

4 голосов
/ 16 сентября 2009

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

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 ().

2 голосов
/ 16 сентября 2009

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

    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;
        }
    }
2 голосов
/ 16 сентября 2009

Вы могли бы Linq это с

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

Возможно, немного более читабельно?

Dan

1 голос
/ 16 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...