Как найти полный путь к исполняемому файлу Mercurial, когда Windows может его найти? - PullRequest
11 голосов
/ 10 ноября 2010

Чтобы уточнить : Вопрос действительно: Как найти клиента командной строки Mercurial . Если ответ применим к любому исполняемому файлу, тем лучше, но я действительно заинтересован в hg.exe исполняемом файле.

Если я знаю имя исполняемого файла, скажем, hg.exe, клиент командной строки Mercurial и Windows знают, где он находится, потому что я могу выполнить только hg log из командной строки, и он выполнит, какие этапы участвуют в для того, чтобы я сам нашел этот исполняемый файл так же, как это делает командная строка и Windows?

По сути, если Windows может найти его, я хочу, чтобы моя программа могла его найти.

Есть ли функция WinAPI или аналогичная? Код будет работать в .NET, написанном на C #, поэтому, если для этого есть что-то встроенное в .NET, это было бы предпочтительным решением, но в остальном я не против использования P / Invoke для этого.

Я видел один потенциальный дубликат этого вопроса: c # Проверьте, существует ли исполняемый файл в пути Windows , но это все, что нужно? Просто переберите содержимое переменной среды PATH и ищите в каждом из этих каталогов исполняемый файл?

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

Если, с другой стороны, здесь действительно присутствует только переменная PATH, ее, вероятно, можно безопасно закрыть как дубликат.

Ответы [ 4 ]

5 голосов
/ 10 ноября 2010

вы можете обмануть и использовать команду where.exe

public GetFullPath(string program)
{
    string result;

    Process myProcess = new Process()
    {
        UseShellExecute = false,
        RedirectStandardOutput = true,
        StartInfo = new ProcessStartInfo(@"%SYSTEMDIR%\where.exe" )
    };

    using (StreamReader sr = myProcess.StandardOutput)
    {
        myProcess.Start();
        result = myStreamReader.ReadLine();
        myProcess.Close();
    }

    return result;
}
3 голосов
/ 10 ноября 2010

Зависит от того, как программа зарегистрирована в системе.Поскольку hg обычно запускается из инструментов или из командной строки, он не будет зарегистрирован в системе.Если бы это было, есть набор ключей реестра, который имеет имя exe и путь.В противном случае вы просто перемещаете путь от первой записи к последней, пока не найдете нужный файл.Первый найденный на пути выигрывает.

Примеры такой «зарегистрированной» программы, excel или winword.

РЕДАКТИРОВАТЬ:

@ BillyONeal ниже указывает, чтоработает только для командных программ "run", но я хотел сказать, что было и второе место.

Кроме того, для тех, кто этого не видел, есть процедуры установки :

Альтернативная схема, которая работает лучше для некоторых, - это поиск hg в PATH

2 голосов
/ 10 ноября 2010

Windows предоставляет функцию SearchPath. Если вы передаете NULL в качестве параметра lpPath, он использует системный путь поиска. В вашем случае вам следует позвонить:

SearchPath(NULL, "hg", NULL, ...)

Объявление C #:

[DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)]
internal static extern int SearchPath(string path, string fileName, string extension, int numBufferChars, StringBuilder buffer, int[] filePart);
2 голосов
/ 10 ноября 2010

Исполняемые файлы загружаются в соответствии с первым совпадающим экземпляром в системном пути. Если выполняется из ярлыка или другого режима, в котором используется абсолютный путь, то, конечно, это версия, которая запускается.

DLL немного сложнее - для нативных DLL есть переопределения, возможно, это то, о чем вы думаете? Смотри здесь .

...