簡體   English   中英

即使授予訪問權限,訪問 UWP 中的文件也會引發 UnauthorizedAccessException

[英]Accessing file in UWP throws UnauthorizedAccessException even with access granted

我正在嘗試瀏覽文件並將它們發送到服務,為此我正在 UWP 中制作一個小型內部實用程序應用程序。

我制作了一個 POC 控制台應用程序,一切正常。

現在我在一個 UWP 應用程序中,執行相同的代碼時我得到一個System.UnauthorizedAccessException

我必須補充一點,異常來自我正在使用的 package(但我沒有開發),我假設因為它在控制台應用程序而不是 UWP 應用程序中工作,錯誤來自我的結果,仍然在這里是完整的錯誤信息:

An exception of type 'System.UnauthorizedAccessException' occurred in System.Private.CoreLib.dll but was not handled in user code
Access to the path 'D:\pulseinvoices\uk_00003.pdf' is denied.

我已在文件系統隱私設置中授權該應用程序在此處輸入圖像描述

我在清單中做了同樣的事情:

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
 
  IgnorableNamespaces="uap mp rescap">

...

  <Capabilities>
    <rescap:Capability Name="broadFileSystemAccess" />
    <Capability Name="internetClient" />
    <uap:Capability Name="documentsLibrary"/>
  </Capabilities>

我在某處讀過,將文件設置為環境變量也是必要的。 這將完全違背文件選擇的目的(如果用戶每次需要選擇文件時都需要設置環境變量,那是不切實際的),但是,嘿,我願意接受建議,所以我也這樣做了:

在此處輸入圖像描述

為了盡可能完整,這是我正在執行的代碼:

private static readonly string FILE = @"D:\pulseinvoices\uk_00003.pdf";  //Test document

await service.ProcessAndWait(FILE, channel, params);

我迷路了,因為控制台應用程序工作正常,執行此代碼僅在 UWP 應用程序中失敗。

重要:正如我在帖子前面所說的, service object 來自外部。dll。 我仍然希望這個問題來自我的最終,所以我可以解決它。 所以我有使用StorageFile的路徑,但是當 that.dll 試圖訪問它時,我得到了異常。 That.dll 在我的解決方案中,所以它應該具有與解決方案相同的訪問權限,對嗎?

一切都是硬編碼的,在這個階段這幾乎是一個單行應用程序。 唯一的區別是它在 UWP 與控制台中運行。

我有哪些選擇?

編輯:為清楚起見,添加更多細節。

這是我在使用 external.dll 處理它之前首先獲取文件的方法。

在此處輸入圖像描述

selectFile后面,使用文件路徑創建了一個自定義 object 等,所以我確實有一個StorageFile object 可以在我的 UWP 應用程序中使用。 只有一次我使用 external.dll 和file.Path失敗。 如果我根本不使用存儲文件而只是對路徑進行硬編碼,我也會遇到同樣的異常。 我的解決方案可以訪問該文件,但該解決方案中的.dll 不能?

即使您聲明了broadFileSystemAccess功能,您仍然無法通過非 UWP API 訪問文件。 相反,您必須使用StorageFile API:

var file = await StorageFile.GetFileFromPathAsync(path);

如果要與非 UWP API 互操作,可以使用文件的Stream using System.IO; 到文件的頂部,然后閱讀:

var stream = await storageFile.OpenStreamForReadAsync();

或者寫:

var stream = await storageFile.OpenStreamForWriteAsync();

這種意外行為的原因應該與@Martin Zikmund 所說的相同。 當您聲明 broadFileSystemAccess 功能時,您必須使用 StorageFile API 來訪問文件。

問題是 API service object 在 DLL 中使用的是什么。 DLL 很有可能正在使用某些桌面 API 來訪問文件,而不是使用 StorageFile API。 這將導致問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM