Как получить имя текущего исполняемого файла в С++

Вопрос:

Я хочу получить полный путь к текущему процессу.

Я использую _getcwd для получения текущего рабочего каталога. Но это не включает имя файла.

Как получить имя файла, например: filename.exe?

Лучший ответ:

В окнах вы можете использовать:

TCHAR szExeFileName[MAX_PATH]; 
GetModuleFileName(NULL, szExeFileName, MAX_PATH);

szExeFileName будет содержать полный путь + имя исполняемого файла

[править]

Для более портативного решения используйте argv[0] или какой-либо другой код на платформе. Здесь вы можете найти такой подход: https://github.com/mirror/boost/blob/master/libs/log/src/process_name.cpp.

Ответ №1

argv[0] вашей основной функции является ваше имя файла.

Простой фрагмент кода:

#include<stdio.h>
int main(int argc,char** argv)
{
//access argv[0] here
}

Ответ №2

В Linux имя файла вашего двоичного файла является адресом символической ссылки в /proc/self/exe. Системный вызов readlink можно использовать для поиска адресата символической ссылки.

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

Ответ №3

Обычно вы можете получить имя исполняемого файла из argv[0]:

#include <stdio.h>
int main(int argc, char* argv[])
{
printf("Running: %s\n", argv[0]);
return 0;
}

Действительно, есть способы приложения к execl() другому приложению (или другой подобной функции) и переопределить этот аргумент. Для системы все равно нетипично изменить ее для такого рода приложений.

Ответ №4

Как уже упоминалось, имя вашего исполняемого файла содержится в argv [0]. Если вам это нужно, вы можете:

cout << argv[0] << endl;

Если вам нужно имя исходного файла исполняемого файла, С++ имеет предопределенный макрос, который вы можете использовать:

cout << __FILE__ << endl;

Перейдите к здесь и выделите “Предопределенные имена макросов”

Ответ №5

Вы можете использовать program_invocation_name из errno.h

https://linux.die.net/man/3/program_invocation_short_name

Ответ №6

В Linux (POSIX?) есть переменная среды, называемая _, которая содержит текущий процесс.

$ echo $_
echo

В С++

#include <stdlib.h>     /* getenv */
#include<iostream>
int main(){
std::cout << getenv("_") << '\n';
return 0;
}

компиляции

$ c++ a.cpp -o a.out
$ ./a.out

печатает ./a.out (или что-то другое – это выполненная строка, включая путь).

Это имеет определенные преимущества по сравнению с другими подходами, его можно читать глобально (не передавать argv[0]) и не требует обработки файлов.

Оцените статью
TechArks.Ru
Добавить комментарий