首页 > 解决方案 > 从 UWP 中的“下载”文件夹中读取文件时出现 UnauthorizedAccessException

问题描述

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."

标签: c#file-iouwp

解决方案


这里有两个问题,一个是安全性(与沙箱有关),另一个更重要,在 UWP 中你需要使用Windows.Storage 命名空间中的实用程序,对文件系统的访问已经被抽象为支持不同的运行时环境和以促进运行时的容器化和沙盒化。

因此,即使正确设置了所有权限,您的代码也可以工作,但您应该使用该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 文件夹本身就是一个特殊的界面,如上所列默认情况下,您的应用只能访问您的应用创建的用户的 Downloads 文件夹中的文件和文件夹。所以当我们需要专门与用户的下载文件夹进行交互时,我们通常会使用DownloadsFolder 类。

  • 当您的应用程序在该文件夹中创建文件并且您希望用户可以访问应用程序域之外的文件时,此概念非常有用,您可以轻松访问它们,他们也是如此。

这篇文章值得一读:UWP 访问被拒绝

访问此文件夹的简单方法是启用BroadFileSystemAccess,但某些用户的安全策略可能不允许执行具有此级别文件系统访问权限的应用程序。

出于这个原因,我强烈建议不要在开发环境中使用它,你会变得自满(阅读Lazy)并且不会为在发布之前可能需要对代码进行的其他根本性更改做好准备。

它还将使您的应用程序通过商店的审批过程复杂化......


推荐阅读