2012-08-28 37 views
2

我已經寫了下面的代碼行打開InstalledFolder目錄下的文件被拒絕的錯誤:CreateFile2返回訪問Windows 8

Platform::String^ locationPath = Platform::String::Concat(Package::Current->InstalledLocation->Path, "\\Assets\\Logo.png"); 

CREATEFILE2_EXTENDED_PARAMETERS extendedParams = {0}; 
extendedParams.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS); 
extendedParams.dwFileAttributes = FILE_ATTRIBUTE_NORMAL; 
extendedParams.dwFileFlags = FILE_FLAG_SEQUENTIAL_SCAN; 
extendedParams.dwSecurityQosFlags = SECURITY_ANONYMOUS; 
extendedParams.lpSecurityAttributes = nullptr; 
extendedParams.hTemplateFile = nullptr; 

Wrappers::FileHandle file(
    CreateFile2(
     locationPath->Data(), 
     GENERIC_READ, 
     0, 
     OPEN_EXISTING, 
     &extendedParams 
     ) 
    ); 

DWORD e = GetLastError(); 
if (file.Get() == INVALID_HANDLE_VALUE) 
{ 
    throw ref new Platform::FailureException(); 
} 

的CreateFile2返回拒絕訪問錯誤。任何人都可以請幫我嗎?

正如JP Alioto的建議,我曾嘗試與WinRT的文件I/O爲以下

create_task(StorageFile::GetFileFromApplicationUriAsync(ref new Windows::Foundation::Uri("ms-appx:///Assets/Logo.png"))) 
    .then([=](StorageFile^ f) 
    { 
     auto p = create_task(f->OpenAsync(FileAccessMode::Read)); 
     p.wait(); 
    }); 

我仍然可以在p.wait以下錯誤():

無效參數傳遞給該考慮的參數無效死亡

感謝功能,

+0

WinRT應用程序在沙箱中運行,對文件系統的訪問受到嚴格限制。你無能爲力。 –

+0

但我應該能夠讀取部署文件夾下的文件。我錯過了什麼嗎? – Liton

回答

6

您通過0獲得dwShareModeCreateFile2的文檔說這個值...

防止其他進程在請求刪除,讀取或寫入訪問時打開文件或設備。只有當應用程序具有對文件的寫入權限時,才能授予對文件或目錄的獨佔訪問權限。

你沒有對包內文件的寫訪問權限,這就是爲什麼你得到拒絕訪問錯誤的原因。您需要將共享模式設置爲FILE_SHARE_READ

+0

就是這樣。我在Windows 8 RC中編寫了代碼,並在那裏工作。現在在RTM中,它並沒有工作。通過FILE_SHARE_MODE,它可以很好地工作。謝謝。 – Liton

+0

我不再安裝RC,但是如果我不得不猜測,我猜測在調試之前發生的部署不能正確設置程序包根權限,並且在部署_really_時可能失敗(例如,通過商店)。雖然這是一個瘋狂的猜測。 –