Как получить доступ к файлу в программном файле без полного пути

Я использую c++/winrt в проекте WinUI3 и пытаюсь заставить приложение открыть текстовый файл, в котором пользователи могут выбрать из него вариант. Файл, который я пытаюсь получить, находится в папке проекта и включен в проект. В настоящее время у меня установлен путь к файлу для моего устройства, поэтому он извлекает текстовый файл из моего каталога. Я хочу, чтобы приложение могло читать из программных файлов вместо длинного пути к файлу, который в настоящее время закодирован. Я попытался изменить относительный путь к файлу и использовал функцию fstream для чтения файла. Я также пытался просто использовать «Aircrafts/Aircrafts.txt», но это тоже не сработало.

Вот фрагмент кода.

      fstream aircraftFile;
string info;

void MainWindow::loadPlatformData()
ifstream aircraftFile; //File Object for list
aircraftFile.open("C:\\Users\\TimmyK\\Documents\\GitHub\\sentinel3\\Sentinel3\\Aircrafts\\Aircrafts.txt", ios::in);

1 ответ

Я предполагаю, что вы пишете проект UWP, поэтому полный доступ к вашему файлу не работает. UWP имеют ограниченный доступ к файловой системе в соответствии с Microsoft Docs.

Для проекта UWP вы помечаете файл как Content Yes в свойствах файла, чтобы он помещался в пакет макета вашего приложения. Обычно «текущий рабочий каталог» указывает на место установки вашей упакованной программы. Вы можете получить полный путь к этому каталогу, используя:

      auto installdir = Windows.ApplicationModel::Current().InstalledLocation();
std::wstring str = installdir.Path().c_str();

Для «классических» настольных приложений Win32 не существует специального решения для упаковки или установки, поэтому существует множество различных способов сделать это. В Visual Studio, когда вы запускаете отладчик или запускаете программу, «текущий рабочий каталог» будет каталогом проекта, но если вы запустите EXE из командной строки, он будет в другом каталоге.

Чтобы найти каталог исполняемого EXE-файла для IInspectable, используйте GetModuleFileName:

      wchar_t exePath[MAX_PATH] = {};
DWORD nc = GetModuleFileNameW(nullptr, exePath, MAX_PATH);
if (nc > MAX_PATH || nc == 0)
{
    // Error condition
}

Типичный шаблон — заглянуть в папку EXE, а затем «пройтись» по каталогу, чтобы найти файлы ресурсов. Это то, что мы часто делаем в примерах DirectX для Win32. См . FindMedia.

Другие вопросы по тегам