cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Аналог GetModuleFileName #584

Open astafiev555 opened 7 months ago

astafiev555 commented 7 months ago

Очень не хватает в современном стандарте функции, которая возвращает абсолютный путь относительно исполняемого файла (получение текущей директории - типа 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