簡體   English   中英

從 UWP 中的“下載”文件夾讀取文件時出現 UnauthorizedAccessException

[英]UnauthorizedAccessException when reading files from Downloads folder in UWP

var path = @"C:\Users\Admin\Downloads\JsonData.json";
var rootObj = JsonConvert.DeserializeObject<Rootobject>(
                  File.ReadAllText(path)
              );

當我在控制台應用程序上執行此操作時,一切正常,但在 uwp 上它拋出以下異常:

System.UnauthorizedAccessException: "Access to the path 'C:\Users\Admin\Downloads\JsonData.json' is denied."

這里有兩個問題,一個是安全性(與 Sandboxing 相關),另一個是更重要的,在 UWP 中你需要使用Windows.Storage Namespace 中的實用程序,對文件系統的訪問已經被抽象出來以支持不同的運行時環境和以促進運行時的容器化和沙箱化。

因此,即使正確設置了所有權限,您的代碼也可以工作,但您應該使用StorageFile接口來訪問文件,因為這將指導您編寫在所有 UWP 運行時更穩定和兼容的代碼。

忽略事物的安全方面,您可以使用存儲實用程序訪問相同的路徑:
閱讀創建、寫入和讀取文件

var path = @"C:\Users\Admin\Downloads\JsonData.json";
var folder = await Windows.Storage.StorageFolder.GetFolderFromPathAsync(System.IO.Path.GetDirectoryName(path));
var file = await folder.GetFileAsync(System.IO.Path.GetFileName(path));
var rootObj = JsonConvert.DeserializeObject<Rootobject>(
                  await Windows.Storage.FileIO.ReadTextAsync(file)
              );

關於安全性和應用程序權限

UWP 應用可以訪問的位置
默認情況下,通用 Windows 平台 (UWP) 應用可以訪問某些文件系統位置。 應用程序還可以通過文件選擇器或通過聲明功能來訪問其他位置。

默認情況下,您的應用程序只能訪問您的應用程序創建的用戶下載文件夾中的文件和文件夾。 但是,您可以通過調用文件選擇器(FileOpenPicker 或 FolderPicker)來訪問用戶下載文件夾中的文件和文件夾,以便用戶可以導航和選擇您的應用程序要訪問的文件或文件夾。

文件選擇器方法

揀貨員的工作原理

文件選擇器之所以起作用是因為您的應用程序不直接訪問任何特定的文件路徑,而是用戶可以瀏覽到用戶有權訪問的任何地方,並且當需要應用程序權限或提升權限時,將為用戶顯示用戶相關的用戶界面提示回應。 選擇器使用此信息為您檢索對文件的訪問權限,而無需對上述所有內容進行編碼。

var picker = new Windows.Storage.Pickers.FileOpenPicker();
picker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail;
picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.Downloads;
picker.FileTypeFilter.Add(".json");

Windows.Storage.StorageFile file = await picker.PickSingleFileAsync();
if (file != null)
{
    var rootObj = JsonConvert.DeserializeObject<Rootobject>(
                      await Windows.Storage.FileIO.ReadTextAsync(file)
                  );
}

聲明能力

UWP 中的 Downloads 文件夾本身就是一個特殊的界面,如上所列默認情況下,您的應用程序只能訪問您的應用程序創建的用戶下載文件夾中的文件和文件夾。 所以當我們需要專門與用戶的下載文件夾進行交互時,通常我們會使用DownloadsFolder 類

  • 當您的應用程序在該文件夾中創建文件時,此概念非常有用,並且您希望用戶可以訪問應用程序域之外的文件,您可以輕松訪問它們,他們也是如此。

這篇文章值得一讀: UWP 訪問被拒絕

獲得此文件夾訪問權限的簡單方法是啟用BroadFileSystemAccess ,但某些用戶安全策略可能不允許執行具有此級別文件系統訪問權限的應用程序。

出於這個原因,我強烈建議即使在開發環境中也不要使用它,你會變得自滿(閱讀Lazy )並且不會為在發布之前可能需要對代碼進行的其他基本更改做好准備。

它還會使您的應用程序通過商店的審批流程復雜化...

暫無
暫無

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

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