C ++ 17 <filesystem>возвращает отказано в доступе независимо от возможностей - PullRequest
0 голосов
/ 25 февраля 2020

Я не уверен, предназначено ли это, но создание «пустого приложения (c ++ / WinRT)» в VS 2019 и попытка чего-то столь же простого, как показано ниже, всегда дает отказ в доступе. Разве для std :: поддерживаются только app dir и local? Или я что-то упустил?

std::filesystem::path file = LR"(C:\Users\name\Pictures\1.png)";
    auto t = std::filesystem::is_regular_file(file);

Я попробовал broadFileSystemAcess без удачи и различных возможностей. Я думаю, что в конечном итоге ответ заключается в том, что это невозможно сделать без использования API доступа к файлам RT вместо c ++ std ::

1 Ответ

1 голос
/ 26 февраля 2020

Приложения UWP не имеют прямого доступа к какой-либо файловой системе, кроме:

  • Неисключительный доступ только для чтения к папке установки пакета
  • Доступ для чтения / записи в папку данных приложения (в роуминге или локально)
  • Чтение / запись в личную временную папку.

Весь другой доступ осуществляется через Windows «посредники» времени выполнения.

Одним из решений является использование Windows API времени выполнения для копирования всего файла во временную папку, а затем использование std::filesystem для временной копии.

Вот пример использования папки с изображениями:

#include "winrt/Windows.Storage.h"
#include "winrt/Windows.Storage.Pickers.h"

using namespace winrt::Windows::Storage;
using namespace winrt::Windows::Storage::Pickers;

FileOpenPicker openPicker;
openPicker.ViewMode(PickerViewMode::Thumbnail);
openPicker.SuggestedStartLocation(PickerLocationId::PicturesLibrary);
openPicker.FileTypeFilter().Append(L".jpg");
openPicker.FileTypeFilter().Append(L".png");

auto file = co_await openPicker.PickSingleFileAsync();
if (file)
{
    auto tempFolder = ApplicationData::Current().TemporaryFolder();
    auto tempFile = co_await file.CopyAsync(tempFolder, file.Name(), NameCollisionOption::GenerateUniqueName);
    if (tempFile)
    {
        std::filesystem::path file = LR"(tempFile.Path().c_str())";
...
        DeleteFile(tempFile.Path().c_str());
    }
}

См. Документы Microsoft

...