![](/img/trans.png)
[英]File.ReadAllBytes throwing UnauthorizedAccessException: 'Access to the path is denied' UWP
[英]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.