2016-04-22 38 views
0

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

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


第1步工作正常。应用程序能够创建文件&在其中写入数据。只有当应用程序稍后尝试访问它时,它是否会收到此错误。
我得到的路径ApplicationData.LocalFolder使用

Windows.Storage.ApplicationData.Current.LocalFolder.Path


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

C:\用户\ 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(); 
    } 


我试图CreateFile2既OPEN_EXISTING & OPEN_ALWAYS选项CREATE_NEW标志参数,但我看到了同样的错误在任何情况下。

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

回答

2

这里的问题与您在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