You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Очень не хватает в современном стандарте функции, которая возвращает абсолютный путь относительно исполняемого файла (получение текущей директории - типа 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 <windows.h>
#include <tchar.h>
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 <unistd.h>
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
The text was updated successfully, but these errors were encountered: