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

Visual c++ Windows UWP CreateFIle2无法读取ApplicationData.LocalFolder中的文件,visual-c++,file-io,uwp,windows-10-universal,c++-cx,Visual C++,File Io,Uwp,Windows 10 Universal,C++ Cx,我正在尝试在C#中构建UWP应用程序。我的应用程序有一个用C++编写的本地库。每当应用程序尝试读取ApplicationData.LocalFolder中的文件时,CreateFile2 api在\u APPCONTAINER中返回错误\u不受支持。该文件存在于为此api指定的路径中。 这是我的应用程序中的操作顺序 启动应用程序。应用程序创建文件并写入一些数据 稍后,基于用户输入,应用程序尝试读取此文件中的数据 步骤1工作正常。应用程序能够创建文件并在其中写入数据。只有当应用程序稍后尝试访问它时

我正在尝试在C#中构建UWP应用程序。我的应用程序有一个用C++编写的本地库。每当应用程序尝试读取ApplicationData.LocalFolder中的文件时,CreateFile2 api在\u APPCONTAINER中返回错误\u不受支持。该文件存在于为此api指定的路径中。
这是我的应用程序中的操作顺序

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

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

    Windows.Storage.ApplicationData.Current.LocalFolder.Path


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

    C:\Users\xxxxx\AppData\Local\Packages\ac7a11e4-c1d6-4d37-b9eb-a4b0dc8f67b8\u 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();
       }
    

    我尝试使用dwCreationDisposition参数的OPEN\u现有OPEN\u始终选项创建文件2,但在这两种情况下我都看到相同的错误。


    我之前也有类似的问题。但这是我的应用程序的一个问题&我已经解决了这个问题。这一次,虽然文件在LocalFolder中可用,但我仍然得到了错误。

    这里的问题与您在
    CREATEFILE2\u EXTENDED\u参数中设置的
    dwSecurityQosFlags
    有关

    从Windows应用商店应用程序调用时,CreateFile2将简化。您只能打开目录中的文件或目录。无法打开命名管道或邮件槽或创建加密文件(文件\u属性\u加密

    dwSecurityQosFlags参数指定SQOS信息。在Windows Stroe应用程序中,我们只能将其设置为
    SECURITY\u ANONYMOUS
    。使用其他标志将在\u APPCONTAINER中引发错误\u不受支持\u异常。这表示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\u FILE\u NOT\u FOUND
    异常,否则它将是
    ERROR\u SUCCESS

    这里的问题与
    dwSecurityQosFlags
    中设置的
    CREATEFILE2\u扩展参数有关

    从Windows应用商店应用程序调用时,CreateFile2将简化。您只能打开目录中的文件或目录。无法打开命名管道或邮件槽或创建加密文件(文件\u属性\u加密

    dwSecurityQosFlags参数指定SQOS信息。在Windows Stroe应用程序中,我们只能将其设置为
    SECURITY\u ANONYMOUS
    。使用其他标志将在\u APPCONTAINER中引发错误\u不受支持\u异常。这表示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\u FILE\u NOT\u FOUND
    异常,否则将是
    ERROR\u SUCCESS