Открытие файла в текущем каталоге

0

Я пытаюсь загрузить файлы, и ранее я использовал жестко скопированные расположения файлов (например, "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:\...

Может ли кто-нибудь указать мне, как я это делаю?

Теги:
directory
file

2 ответа

4
Лучший ответ

Путь поиска для большинства систем начинается с текущего рабочего каталога, а затем с PATH среды PATH. Итак, все, что вам нужно сделать, это указать файл/папку без абсолютной маркировки пути, и она будет использовать путь относительно рабочего каталога:

ifstream myfile;
myfile.open("settings\\settings.cfg");
//           ^^ Note the lack of \\ to start the file path
  • 0
    Это работает! Спасибо!
  • 2
    @ user2827019 Как я уже упоминал в своем ответе, это не относится к каталогу исполняемого файла. Это только относительно текущего каталога пользователя. Он будет соответствовать только каталогу исполняемого файла, если пользователь запускает исполняемый файл из своего каталога.
Показать ещё 1 комментарий
3

Пути, начинающиеся с \, всегда относятся к корневому каталогу текущего накопителя. Если текущий диск 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 к нему.

  • 0
    Так нет способа сделать это? Я всегда должен указать точное местоположение для всего? Если я изменю свой код на \settings\settings.cfg он всегда будет помещать и читать файл в C: /settings/settings.cfg, даже если они «установлены» в c: \ game или c: \ client.
  • 0
    @ user2827019 Используйте функцию GetModuleFileNameW (), как показано в коде.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню