2016-04-22 36 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