Создать файл с установленным параметром broadfilesystemaccess - std :: ifstream работает, std :: ofstream получает отказ в доступе в той же папке - PullRequest
0 голосов
/ 04 июля 2019

Я не могу создать файл, используя c ++ / winrt, uwp и std :: ofstream. Я получаю 0x0000005 (доступ запрещен) при вызове GetLastError (). Я могу успешно читать в файле, используя std :: ifstream из той же папки. Я использую windows10 ver1903 x64, vs2017 ver15.9.13

Я добавил broadFileSystemAccess в манифест пакета и разрешил доступ к файловой системе для всей системы и для самого приложения. Я получаю предупреждение об использовании rescap: Capacity в манифесте, но приложение компилируется и не ограничивает другие (из того, что я прочитал) в успешном доступе к файловой системе.

Из манифеста пакета:

<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:iot="http://schemas.microsoft.com/appx/manifest/iot/windows10" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" IgnorableNamespaces="uap mp iot rescap" >

Это раздел Возможности:

  <Capabilities>
    <Capability Name="internetClient" />
    <rescap:Capability Name="broadFileSystemAccess" />
    <DeviceCapability Name="serialcommunication">
      <Device Id="any">
        <Function Type="name:serialPort" />
      </Device>
    </DeviceCapability>
  </Capabilities>

Это мой вызов ofstream с strOutputFileName, содержащим имя файла, который я хочу создать в каталоге Debug \ UWPAA \ AppX приложения (UWPAA) (я также пробовал другие каталоги):

std::ofstream ofBinary;
ofBinary.open(strOutputFileName, ios::out);

Я ожидал, что приложение сможет создавать файл, тем более что я могу открывать файлы в файловой системе с помощью std :: ifstream, но вместо этого я получаю сообщение «Отказано в доступе».

Есть идеи? Это сводит меня с ума ...

Ответы [ 2 ]

0 голосов
/ 18 июля 2019

Для уточнения частичного обходного пути теперь возможно (начиная с версии 1803) использовать CreatFileFromApp, который позволяет создавать файл везде, где у приложения есть брокерский доступ (в случае broadFileSystemAccess, ко всей файловой системе).).После создания файла вы можете получить доступ к РУЧКЕ файла через IStorageItemHandleAccess StorageFile.Таким образом, теперь стало возможным использовать HANDLE с интерфейсом Win32, единственная проблема (поэтому я и называю это частичным обходным путем), я не нашел способа предоставить дескриптор std :: ofstream, поэтому яя застрял с использованием Win32 API для доступа к файлу.

0 голосов
/ 06 июля 2019

Вам захочется прочитать документацию здесь .В частности, место установки приложения доступно только для чтения.Также обратите внимание, что приложение может размещать локальные и перемещаемые данные в разных местах в зависимости от потребностей приложения.

...