Как получить доступ к файлу в программном файле без полного пути
Я использую 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.