我正在尝试用C#构建UWP应用程序。我的应用程序有一个用C ++编写的本机库。每当应用尝试读取 ApplicationData.LocalFolder 中的文件时,CreateFile2 api都会返回 ERROR_NOT_SUPPORTED_IN_APPCONTAINER 。该文件存在于为此api指定的路径中。
这是我的应用程序中的操作顺序。
第1步工作正常。应用程序可以创建文件&在其中写入数据。只有当应用程序稍后尝试访问它时,才会出现此错误。
我使用
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中可用,但我仍然收到错误。
答案 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
。