#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; }
Комментариев нет:
Отправить комментарий