Вопрос:
Я хочу получить полный путь к текущему процессу.
Я использую _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: %sn», argv[0]); return 0; }
Действительно, есть способы приложения к execl() другому приложению (или другой подобной функции) и переопределить этот аргумент. Для системы все равно нетипично изменить ее для такого рода приложений.
Ответ №4
Как уже упоминалось, имя вашего исполняемого файла содержится в argv [0]. Если вам это нужно, вы можете:
cout << argv[0] << endl;
Если вам нужно имя исходного файла исполняемого файла, С++ имеет предопределенный макрос, который вы можете использовать:
cout << __FILE__ << endl;
Перейдите к здесь и выделите “Предопределенные имена макросов”
Ответ №5
Вы можете использовать program_invocation_name из errno.h
Ответ №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]) и не требует обработки файлов.