C++ Корневая (текущая) папка программы

454
15 декабря 2017, 03:33

С++ Как задать корневую (текущую) папку для программы, например у меня есть параграмма с файлами картинками (ресурсы программы), но если я откраиваю файл с помощью этой параграммы, программа не находит своих файлов (ресурсов). в итоге Корневая (текущая) директория устанавливается в папке с открытым файлом. А если я просто открываю программу Корневая (текущая) директория устанавливается в папке с программой, и все ресурсы загружаются отлично.

Использую visual studio 2010 ОС: windows 10 x86

Answer 1

Рабочий каталог используется для поиска файлов, заданных с помощью относительного пути.

Текущая директория наследуется программой от её родителя. К примеру, если запустить в командной строке, то по умолчанию программа будет искать файлы относительно текущего пути в командной строчке (pwd, echo %cd%).

Если вы запускаете программу вне папки с картинками, то в настройках передайте необходимый путь (в конфигурационном файле, в переменных окружения, в опциях командной строки) и используйте абсолютные пути для открытия файлов (переданный путь + относительный путь). Вот пример, где используется либо путь, заданный в командной строке, либо текущий путь, если не задан путь:

fs::path dirpath = (argc == 2) ? argv[1] : fs::current_path();

Чтобы объединить переданный путь и относительный путь: path = dirpath / relpath.

Выражение "корневая директория" не имеет отношения к текущей директории (к примеру, chroot(2) vs. chdir(2)).

Answer 2

вот пришёл к такому решению благодаря ан пользователю jfs сумел правильно сформулировать поисковый запрос

еще такой парадокс на заметку: когда я в настройках проекта -> компонировщик - дополнительно устанавливаю точку входа "main" аргумент argc ведет себя странно и принимает некоректное значение, и и массив argv становится пустым что приводит к ошибке при запуске.

проект создаётся как пустой;

функция SetCurrentDirectory("путь"); устанавливает текучкою директорию.

#include<string>
#include<Windows.h>
using namespace std;
void main(int argc, char*argv[])
{
    //Получить текущую деректорию
    //TCHAR buffer[MAX_PATH];
    //GetCurrentDirectory(sizeof(buffer),buffer);
    //cout << buffer << endl;

    if(argc > 0)
    {
    //получаим путь к програме
    string urlK = ""; 
    urlK += argv[0];
    //удаляем всё до слеша (название програмы)
    while(urlK.size() > 0) { bool br = 0;if(urlK[urlK.size()-1] == '/' || urlK[urlK.size()-1] == '\\'){br = 1;}
    urlK.erase(urlK.size()-1); if(br)break; }
    //устанавливаем путь к кааталогу с прорамой как основной
    SetCurrentDirectory(urlK.c_str());
    }
return;
}
READ ALSO
Как обновить конкретную область на QGraphicsScene?

Как обновить конкретную область на QGraphicsScene?

Собственно, вопрос следующий: Есть у меня QGraphicsView у которого есть QGraphicsSceneДля QGraphicsScene установлен следующий режим:

289
Не собирается alglib в проекте

Не собирается alglib в проекте

Доброе всем время суток, скачал с оф сайта alglib для С++ В инструкции на ОФ сайте сказано что нужно просто подключить h файл и все будет прекрасно,...

299
Компилятор не может найти omp.h

Компилятор не может найти omp.h

Не получается подключить поддержку OpenMP в XcodeПри попытке компиляции любого кода появляется ошибка:

245
.lib не является приложением win32

.lib не является приложением win32

В одном решении у меня находятся два приложения: Статическая библиотека и Консольное приложениеСобрал библиотеку, добавил в консольное...

328