创建具有broadfilesystemaccess设置的文件-std :: ifstream有效,std :: ofstream拒绝访问同一文件夹

时间:2019-07-04 13:16:51

标签: uwp windows-10-universal c++-winrt

我无法使用c ++ / winrt,uwp和std :: ofstream创建文件。调用GetLastError()时收到0x0000005(访问被拒绝)。我可以使用std :: ifstream从同一文件夹中成功读取文件。 我正在运行Windows10 ver1903 x64,vs2017 ver15.9.13

我已将broadFileSystemAccess添加到程序包清单中,并为整个系统和应用程序本身启用了文件系统访问。我确实收到有关清单中使用rescap:Capability的警告,但该应用程序已编译,并且没有限制其他人(根据我的阅读)成功访问文件系统。

从包装清单中显示:

<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>

这是我对strstreamFileName的ofstream的调用,其中包含要在(UWPAA)应用程序的Debug \ UWPAA \ AppX目录中创建的文件的文件名(我也尝试过其他目录):

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

我本来希望应用程序能够创建文件,尤其是因为我能够使用std :: ifstream在文件系统中打开文件,但我却收到“访问被拒绝”的信息。

有什么想法吗?这让我发疯了...

2 个答案:

答案 0 :(得分:0)

您需要通读文档here。具体而言,应用程序安装位置为只读。还要注意,应用程序可以根据应用程序的需要将本地和漫游数据放在单独的位置。

答案 1 :(得分:0)

要详细说明部分解决方法,现在(从版本1803开始)可以使用CreatFileFromApp,它允许您在应用程序具有代理访问权限的任何位置(对于broadFileSystemAccess,则是整个文件系统)创建文件)。创建文件后,您可以通过StorageFile的IStorageItemHandleAccess访问文件的HANDLE。 通过这种方式,现在可以使用带有Win32接口的HANDLE,唯一的问题是(这就是为什么我将其称为部分解决方法),我还没有找到提供std :: ofstream句柄的方法,所以我使用Win32 api进行文件访问时卡住了。