2016-03-24 76 views
0

我試圖用我的DirectX 11項目打開DDS文件,但是,大多數情況下,它拒絕打開它。每次失敗,我都會收到E_ACCESSDENIED錯誤。 使其工作的唯一方法是將相對路徑放到當前目錄或子目錄中。如果它是到父目錄的相對路徑,或者它是絕對路徑,則該函數將失敗。無法打開C++(directx應用程序)訪問被拒絕的文件

的問題是,我想打開使用FileOpenPicker的形象,所以在每一個情況下,我得到一個絕對路徑...

我將分享我的功能:

void Element::FileOpenDialog() 
{ 
    FileOpenPicker^ fileOpenPicker = ref new FileOpenPicker(); 
    fileOpenPicker->ViewMode = PickerViewMode::Thumbnail; 
    fileOpenPicker->SuggestedStartLocation = PickerLocationId::PicturesLibrary; 
    fileOpenPicker->CommitButtonText = "Load"; 
    fileOpenPicker->FileTypeFilter->Append(".dds"); 
    create_task(fileOpenPicker->PickSingleFileAsync()).then([this](StorageFile^ file) 
    { 
     if (file) 
     { 
      m_fullPath = const_cast<wchar_t*>(file->Path->Data()); 
      wcout << m_fullPath << endl; // prints the correct path of the selected file 

      m_loadedImage = false; 
     } 
     m_choseImage = true; // Checking in another code if the user chose an image to load. 
    }); 
} 

然後,我稱之爲加載紋理的函數...

bool Texture::LoadFile(wchar_t* path, GameWindow^ gameWindow) 
{ 
    m_gameWindow = gameWindow; 
    ComPtr<ID3D11Resource> resource = nullptr; 
    if (!FH::ThrowIfFailed(CreateDDSTextureFromFile(m_gameWindow->dev.Get(), L"texture.dds", resource.GetAddressOf(), m_texture.ReleaseAndGetAddressOf()))) return false; // Works 
    if (!FH::ThrowIfFailed(CreateDDSTextureFromFile(m_gameWindow->dev.Get(), L"texture\\texture.dds", resource.GetAddressOf(), m_texture.ReleaseAndGetAddressOf()))) return false; // Works 
    if (!FH::ThrowIfFailed(CreateDDSTextureFromFile(m_gameWindow->dev.Get(), L"..\\texture.dds", resource.GetAddressOf(), m_texture.ReleaseAndGetAddressOf()))) return false; // E_ACCESSDENIED 
    if (!FH::ThrowIfFailed(CreateDDSTextureFromFile(m_gameWindow->dev.Get(), path, resource.GetAddressOf(), m_texture.ReleaseAndGetAddressOf()))) return false; // E_ACCESSDENIED 
    return true; 
} 

那麼,因爲我不知道爲什麼,這就是爲什麼我來這裏要求你的幫助。

非常感謝!

回答

0

UWP應用程序沒有直接文件訪問文件選擇器正在選擇的位置。 FileOpenPicker是以您的名義代理的代理商,但不能使用標準文件I/O,只能使用WinRT API。請記住,拾取的文件可能甚至不在本地文件系統上。唯一可以直接訪問I/O的文件位置是安裝的文件夾(只讀),臨時文件夾(讀寫)和應用程序數據文件夾(可讀寫)。

有關更多信息,請參見MSDN上的File access and permissions (Windows Runtime apps)

解決方法是將選定的中介文件複製到您有權訪問的臨時文件位置,然後在臨時副本上使用CreateDDSTextureFromFile

#include <ppltasks.h> 
using namespace concurrency; 

using Windows::Storage; 
using Windows::Storage::Pickers; 

create_task(openPicker->PickSingleFileAsync()).then([](StorageFile^ file) 
{ 
    if (file) 
    { 
     auto tempFolder = Windows::Storage::ApplicationData::Current->TemporaryFolder; 
     create_task(file->CopyAsync(tempFolder, file->Name, NameCollisionOption::GenerateUniqueName)).then([](StorageFile^ tempFile) 
     { 
      if (tempFile) 
      { 
       HRESULT hr = CreateDDSTextureFromFile(..., tempFile->Path->Data(), ...); 
       DeleteFile(tempFile->Path->Data()); 
       DX::ThrowIfFailed(hr); 
      } 
     }); 
    }); 

這是覆蓋在細節上DirectX Tool Kit wiki,與寫入的情況下覆蓋there爲好。

+0

非常感謝,我不知道它,現在它的工作! – Drake

相關問題