【问题标题】:Create file with broadfilesystemaccess set - std::ifstream works, std::ofstream gets access denied in same folder创建具有广泛文件系统访问集的文件 - std::ifstream 有效,std::ofstream 在同一文件夹中被拒绝访问
【发布时间】:2019-07-04 13:16:51
【问题描述】:

我无法使用 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>

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

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

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

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

【问题讨论】:

  • 如果您将它们对准应用程序具有写入权限的位置(即 ApplicationData 文件夹中的位置),它们应该可以正常工作。因此您可以尝试使用 localFolder 目录.
  • 谢谢飞王。确实,在 localFolder 中我可以读写。在 AppX 目录中,我只能读取(所以我猜它是只读的),但我无权访问文件系统,这应该由 broadFileSystemAccess 定义。我尝试在文件系统中的目录中读取和写入并收到“拒绝访问”。所以我想我的问题实际上在于broadFileSystemAccess 不起作用......正如我上面提到的,应用程序已列出,并且应用程序的文件系统访问设置通常已打开。有什么想法我可能做错了吗?
  • 从下面的评论中,你似乎找到了答案。这对遇到相同问题的其他社区会有帮助。所以如果你解决了你的问题,你可以直接发布答案。

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


【解决方案1】:

您需要通读文档here。具体来说,应用安装位置是只读的。另请注意,应用程序可以根据应用程序需要将本地和漫游数据放在不同的位置。

【讨论】:

  • 是的,谢谢 Ben,我现在明白了,我不能使用 stl 访问具有 broadFileSystemAccess 的应用程序目录之外的文件,只能通过 winRT 提供的代理 API。我在这里找到了一个描述问题的线程和部分解决方法:social.msdn.microsoft.com/Forums/Lync/en-US/…
【解决方案2】:

为了详细说明部分解决方法,现在可以(从版本 1803 开始​​)使用 CreatFileFromApp,它允许您在应用程序代理访问的任何地方创建文件(在 broadFileSystemAccess 的情况下,对整个文件系统)。创建文件后,您可以通过 StorageFile 的 IStorageItemHandleAccess 访问文件的 HANDLE。 以这种方式,现在可以将 HANDLE 与 Win32 接口一起使用,唯一的问题是(这就是为什么我称之为部分解决方法),我还没有找到一种方法来提供 std::ofstream 的句柄,所以我我被困在使用 win32 api 进行文件访问。

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多