Страницы

Поиск по вопросам

вторник, 24 декабря 2019 г.

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

#cpp #windows #visual_studio #файлы #файловая_система


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

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

Ответ что я ожыдал
функцыя устанавлевает корневую папку SetCurrentDirectory("Путь к корневой папке програмы");
    


Ответы

Ответ 1



Рабочий каталог используется для поиска файлов, заданных с помощью относительного пути. Текущая директория наследуется программой от её родителя. К примеру, если запустить в командной строке, то по умолчанию программа будет искать файлы относительно текущего пути в командной строчке (pwd, echo %cd%). Если вы запускаете программу вне папки с картинками, то в настройках передайте необходимый путь (в конфигурационном файле, в переменных окружения, в опциях командной строки) и используйте абсолютные пути для открытия файлов (переданный путь + относительный путь). Вот пример, где используется либо путь, заданный в командной строке, либо текущий путь, если не задан путь: fs::path dirpath = (argc == 2) ? argv[1] : fs::current_path(); Чтобы объединить переданный путь и относительный путь: path = dirpath / relpath. Выражение "корневая директория" не имеет отношения к текущей директории (к примеру, chroot(2) vs. chdir(2)).

Ответ 2



вот пришёл к такому решению благодаря ан пользователю jfs сумел правильно сформулировать поисковый запрос еще такой парадокс на заметку: когда я в настройках проекта -> компонировщик - дополнительно устанавливаю точку входа "main" аргумент argc ведет себя странно и принимает некоректное значение, и и массив argv становится пустым что приводит к ошибке при запуске. проект создаётся как пустой; функция SetCurrentDirectory("путь"); устанавливает текучкою директорию. #include #include 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; } Вот пример где устранена ошибка которою я описывал выше. #include #include //======================= //Отримати місцезнаходження програми char* SvcInstall() { TCHAR szPath[MAX_PATH]; if( !GetModuleFileName( NULL, szPath, MAX_PATH ) ) { return "error"; } return szPath; } //Отримати місцезнаходження програми і задати папку як кореневу std::string SetDIR() { //получаим путь к програме std::string urlK = ""; urlK += SvcInstall(); //удаляем всё до слеша (название програмы) 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 urlK; } int main() { // функцыя возвращает путь к папке с програмой, и автоматичиски устанавлевает ее ка текущую SetDIR(); return 0; }

Комментариев нет:

Отправить комментарий