Очень не хватает в современном стандарте функции, которая возвращает абсолютный путь относительно исполняемого файла (получение текущей директории - типа getCWD не подходит в некоторых случаях, т.к. текущая директория не обязана всегда указывать на папку, где лежит исполняемый файл)
(Требуется очень часто загружать какие-то конфигурационные файлы из папок, расположение которых жёстко фиксировано относительно исполняемого файла)
Один из вариантов реализации такой функции (get_main_module_path, пример):
Очень не хватает в современном стандарте функции, которая возвращает абсолютный путь относительно исполняемого файла (получение текущей директории - типа getCWD не подходит в некоторых случаях, т.к. текущая директория не обязана всегда указывать на папку, где лежит исполняемый файл)
(Требуется очень часто загружать какие-то конфигурационные файлы из папок, расположение которых жёстко фиксировано относительно исполняемого файла)
Один из вариантов реализации такой функции (get_main_module_path, пример):
include
std::filesystem::path get_main_module_path();
ifdef _MSC_VER
define WIN32_LEAN_AND_MEAN
include
include
std::filesystem::path get_main_module_path() { TCHAR gPath[FILENAME_MAX + 1]; int32_t sz = GetModuleFileName(nullptr, gPath, FILENAME_MAX); if (sz >= 0) { gPath[sz] = _T('\0'); } TCHAR *fnd = _tcsrchr(gPath, _T('\')); if (fnd) { fnd[1] = _T('\0'); } std::filesystem::path ret = gPath; return ret; }
else
include
include
include
std::filesystem::path get_main_module_path() { char gPath[FILENAME_MAX + 1]; char buff[64]; uint32_t pid = (uint32_t)getpid(); int32_t sz = 0;
if defined(__sun) || defined(sun)
sprintf(buff, "/proc/%u/path/a.out", pid);
else
sprintf(buff, "/proc/%u/exe", pid); sz = (int32_t)readlink(buff, gPath, FILENAME_MAX);
endif
if (sz >= 0) { gPath[sz] = '\0'; } char *fnd = strrchr(gPath, '/'); if (fnd) { fnd[1] = '\0'; } std::filesystem::path ret = gPath; return ret; }
endif