C++ открытие файла относительно папки .exe
Есть консольная программа, например компилятор. В папке с программой есть config-файлы. И вот вопрос: как мне открывать этот файл. Полные пути прописать не получится, а если получится - то будет тяжело. А если относительный путь - то он будет относителен той папке, в которой находится пользователь.
Например:
Возможно ли открыть файл относительно exe файла? Если да - то как?
Или предложите вариант по-лучше, если такой есть.
Ответы (1 шт):
Автор решения: Majestio
→ Ссылка
Возможно ли открыть файл относительно exe файла? Если да - то как?
Для С++17 можно попробовать так:
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
#include <windows.h>
#else
#include <limits.h>
#include <stdlib.h>
#endif
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
std::string GetConfigPath(const char* argv) {
std::string ret;
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
#pragma message("win")
char *dir = (char*)calloc(32767,sizeof(char));
if (dir != nullptr) {
if(GetModuleFileName(nullptr,dir,32767) > 0) ret = dir;
free(dir);
}
#else
#pragma message("posix")
char *dir = (char*)calloc(PATH_MAX, sizeof(char));
if (dir != nullptr) {
char *tmp = realpath(argv, dir);
if (tmp != nullptr) ret = tmp;
free(dir);
}
#endif
try {
ret = fs::canonical(fs::path(ret)).replace_extension(".conf").string();
} catch(...) {
ret = "";
}
return ret;
}
int main(int, char** argv) {
std::cout << GetConfigPath(argv[0]) << std::endl;
return 0;
}
При условии. что запускаемый процесс корректно заполняет argv[0].
Онлайн пример для POSIX - тут.
