Windows UWP CreateFIle2 无法读取 ApplicationData.LocalFolder 中的文件
Windows UWP CreateFIle2 cannot read file in ApplicationData.LocalFolder
我正在尝试使用 C# 构建 UWP 应用程序。我的应用程序有一个用 C++ 编写的本机库。每当应用程序尝试读取 ApplicationData.LocalFolder 中的文件时,CreateFile2 api 将返回 ERROR_NOT_SUPPORTED_IN_APPCONTAINER。该文件存在于为此 api 指定的路径中。
这是我的应用程序中的操作顺序。
- 启动应用程序。应用程序创建文件并写入一些数据
- 稍后基于用户输入的应用会尝试读取此文件中的数据
第 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_EXISTING 和 OPEN_ALWAYS 选项的 CreateFile2 dwCreationDisposition 参数,但在任何一种情况下我都看到相同的错误。
我之前在 中遇到过类似的问题。但那是我的应用程序的问题,我已经解决了这个问题。这次虽然文件在 LocalFolder 中可用,但我仍然收到错误。
这里的问题与您在 CREATEFILE2_EXTENDED_PARAMETERS
中设置的 dwSecurityQosFlags
有关。
When called from a Windows Store app, CreateFile2 is simplified. You can open only files or directories inside the ApplicationData.LocalFolder or Package.InstalledLocation directories. You can't open named pipes or mailslots or create encrypted files (FILE_ATTRIBUTE_ENCRYPTED).
dwSecurityQosFlags参数指定SQOS信息。在Windows Stroe app中,我们只能设置为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
.
我正在尝试使用 C# 构建 UWP 应用程序。我的应用程序有一个用 C++ 编写的本机库。每当应用程序尝试读取 ApplicationData.LocalFolder 中的文件时,CreateFile2 api 将返回 ERROR_NOT_SUPPORTED_IN_APPCONTAINER。该文件存在于为此 api 指定的路径中。
这是我的应用程序中的操作顺序。
- 启动应用程序。应用程序创建文件并写入一些数据
- 稍后基于用户输入的应用会尝试读取此文件中的数据
第 1 步工作正常。应用程序能够创建文件并在其中写入数据。只有当应用稍后尝试访问它时,才会出现此错误。
我使用
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_EXISTING 和 OPEN_ALWAYS 选项的 CreateFile2 dwCreationDisposition 参数,但在任何一种情况下我都看到相同的错误。
我之前在
这里的问题与您在 CREATEFILE2_EXTENDED_PARAMETERS
中设置的 dwSecurityQosFlags
有关。
When called from a Windows Store app, CreateFile2 is simplified. You can open only files or directories inside the ApplicationData.LocalFolder or Package.InstalledLocation directories. You can't open named pipes or mailslots or create encrypted files (FILE_ATTRIBUTE_ENCRYPTED).
dwSecurityQosFlags参数指定SQOS信息。在Windows Stroe app中,我们只能设置为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
.