【问题标题】:Windows UWP CreateFIle2 cannot read file in ApplicationData.LocalFolderWindows UWP CreateFIle2 无法读取 ApplicationData.LocalFolder 中的文件
【发布时间】:2016-08-15 12:48:22
【问题描述】:

我正在尝试用 C# 构建 UWP 应用程序。我的应用程序有一个用 C++ 编写的本机库。每当应用尝试读取 ApplicationData.LocalFolder 中的文件时,CreateFile2 api 都会返回 ERROR_NOT_SUPPORTED_IN_APPCONTAINER。该文件存在于为此 api 指定的路径中。
这是我的应用中的操作顺序。

  1. 启动应用程序。应用创建文件并写入一些数据
  2. 稍后基于用户输入的应用程序会尝试读取此文件中的数据


第 1 步工作正常。应用程序能够创建文件并在其中写入数据。只有当应用程序稍后尝试访问它时,它才会收到此错误。
我使用

获得 ApplicationData.LocalFolder 的路径

Windows.Storage.ApplicationData.Current.LocalFolder.Path


这是我在应用中看到的实际路径:

C:\Users\xxxxx\AppData\Local\Packages\ac7a11e4-c1d6-4d37-b9eb-a4b0dc8f67b8_yyjvd81p022em\LocalState\temp.txt


我的代码如下:

CREATEFILE2_EXTENDED_PARAMETERS ms_param = {0};
   ms_param.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS);
   ms_param.dwFileAttributes = FILE_ATTRIBUTE_READONLY;
   ms_param.dwFileFlags = FILE_FLAG_NO_BUFFERING;
   ms_param.dwSecurityQosFlags = SECURITY_DELEGATION;
   ms_param.lpSecurityAttributes = NULL;
   ms_param.hTemplateFile = NULL;

   g_hfile = CreateFile2(filename, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, OPEN_EXISTING, &ms_param);
   if (g_hfile == INVALID_HANDLE_VALUE)
   {
           return GetLastError();
   }


我尝试使用 OPEN_EXISTINGOPEN_ALWAYS 选项为 dwCreationDisposition 参数的 CreateFile2,但我看到了在任何一种情况下都会出现相同的错误。

我之前遇到过与 CreateFile2 类似的问题。但这是我的应用程序的一个问题,我已经解决了这个问题。这次虽然文件在 LocalFolder 中可用,但我仍然收到错误消息。

【问题讨论】:

    标签: visual-c++ file-io uwp windows-10-universal c++-cx


    【解决方案1】:

    这里的问题与您在CREATEFILE2_EXTENDED_PARAMETERS 中设置的dwSecurityQosFlags 有关。

    当从 Windows 应用商店应用调用时,CreateFile2 被简化。您只能打开 ApplicationData.LocalFolderPackage.InstalledLocation 目录中的文件或目录。您无法打开命名管道或邮槽或创建加密文件 (FILE_ATTRIBUTE_ENCRYPTED)。

    dwSecurityQosFlags 参数指定 SQOS 信息。在 Windows Stroe 应用中,我们只能将其设置为 SECURITY_ANONYMOUS。使用其他标志会引发 ERROR_NOT_SUPPORTED_IN_APPCONTAINER 异常。这表明它在 UWP 应用中不受支持。

    以下是我用来测试的代码:

    StorageFolder^ localFolder = ApplicationData::Current->LocalFolder;
    String^ path = localFolder->Path;
    path += L"\\MyFile.txt";
    
    CREATEFILE2_EXTENDED_PARAMETERS ms_param = { 0 };
    ms_param.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS);
    ms_param.dwFileAttributes = FILE_ATTRIBUTE_READONLY;
    ms_param.dwFileFlags = FILE_FLAG_NO_BUFFERING;
    ms_param.dwSecurityQosFlags = SECURITY_ANONYMOUS;
    ms_param.lpSecurityAttributes = NULL;
    ms_param.hTemplateFile = NULL;
    
    HANDLE g_hfile = CreateFile2(path->Data(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, OPEN_EXISTING, &ms_param);
    
    DWORD error = GetLastError();
    

    如果我在LocalFolder下没有“MyFile.txt”,我会得到ERROR_FILE_NOT_FOUND异常,否则会是ERROR_SUCCESS

    【讨论】:

      猜你喜欢
      • 2017-11-15
      • 1970-01-01
      • 2012-02-23
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      相关资源
      最近更新 更多