Я пытаюсь загрузить файлы, и ранее я использовал жестко скопированные расположения файлов (например, "c:\location\file.txt"), но теперь, когда несколько друзей также используют этот файл, я бы хотел, чтобы они поместите исполняемый файл туда, где они хотят.
мой текущий код выглядит так:
ifstream myfile;
myfile.open("c:\\client\\settings.cfg");
Я пытаюсь изменить его так, чтобы пользователь помещал их исполняемый файл в нужную папку, а затем создавал папку и помещал в нее свой файл настроек, и exe будет загружать это с их настройками.
ifstream myfile;
myfile.open("\\settings\\settings.cfg");
У меня есть некоторая базовая обработка ошибок на месте, и теперь программа всегда ошибается, говоря, что она не может найти файл.
Структура файла выглядит следующим образом:
[ART]
asset.png
[SETTINGS]
settings.cfg
client.exe
Это кажется очень простой задачей, но я не могу найти способ сделать это. Каждый пример и руководство по чтению и записи файлов имеют только файлы в исполняемом каталоге или жестко закодированы в папку c:\...
Может ли кто-нибудь указать мне, как я это делаю?
Путь поиска для большинства систем начинается с текущего рабочего каталога, а затем с PATH
среды PATH
. Итак, все, что вам нужно сделать, это указать файл/папку без абсолютной маркировки пути, и она будет использовать путь относительно рабочего каталога:
ifstream myfile;
myfile.open("settings\\settings.cfg");
// ^^ Note the lack of \\ to start the file path
Пути, начинающиеся с \
, всегда относятся к корневому каталогу текущего накопителя. Если текущий диск C:
то \settings\settings.cfg
означает C:\settings\settings.cfg
.
Обратите внимание, что вы можете использовать /
, чтобы избежать выхода из всех. Таким образом, вы можете использовать: settings/settings.cfg
. Это будет относиться к текущему каталогу пользователя. Обратите внимание, однако, что это не обязательно соответствует каталогу, в котором находится исполняемый файл. Если вам нужен каталог исполняемого файла, вам необходимо использовать функцию Windows API для его получения:
#include <Windows.h>
// ...
HMODULE module = GetModuleHandleW(NULL);
WCHAR path[MAX_PATH];
GetModuleFileNameW(module, path, MAX_PATH);
Теперь, если вы хотите открыть settings/settings.cfg
относительно каталога исполняемого файла, создайте путь, который начинается с path
и добавляет /settings/settings.cfg
к нему.
\settings\settings.cfg
он всегда будет помещать и читать файл в C: /settings/settings.cfg, даже если они «установлены» в c: \ game или c: \ client.