Windows UWP CreateFIle2无法读取ApplicationData.LocalFolder中的文件

时间:2016-04-22 03:50:35

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

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

  1. 启动应用。 App创建文件&写一些数据
  2. 稍后根据用户输入应用尝试读取此文件中的数据

  3. 第1步工作正常。应用程序可以创建文件&在其中写入数据。只有当应用程序稍后尝试访问它时,才会出现此错误。
    我使用

    获取 ApplicationData.LocalFolder 的路径
      

    Windows.Storage.ApplicationData.Current.LocalFolder.Path


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

      

    C:\ Users \用户XXXXX \应用程序数据\本地\软件包\ 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_EXISTING & dwCreationDisposition 参数的 OPEN_ALWAYS 选项,但在任何一种情况下我都会看到相同的错误。
    我之前与CreateFile2有过类似的问题。但这是我的应用程序的一个问题&我已经解决了这个问题。这次虽然文件在LocalFolder中可用,但我仍然收到错误。

1 个答案:

答案 0 :(得分:2)

此处的问题与您在dwSecurityQosFlags中设置的CREATEFILE2_EXTENDED_PARAMETERS有关。

  

从Windows应用商店应用调用时, CreateFile2 已简化。您只能在 ApplicationData.LocalFolder Package.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