Windows 10 通用应用程序文件/目录访问

Posted

技术标签:

【中文标题】Windows 10 通用应用程序文件/目录访问【英文标题】:Windows 10 Universal App File/Directory Access 【发布时间】:2020-05-07 23:11:29 【问题描述】:

我正在开发一个应用程序,它从文件系统上的可配置位置读取 jpeg 和 pdf 文件。 目前有一个在 WPF 中实现的运行版本,现在我正在尝试迁移到新的 Windows 通用应用程序。

以下代码在 WPF 中运行良好:

public IList<string> GetFilesByNumber(string path, string number)
    
        if (string.IsNullOrWhiteSpace(path))
            throw new ArgumentNullException(nameof(path));

        if (string.IsNullOrWhiteSpace(number))
            throw new ArgumentNullException(nameof(number));

        if (!Directory.Exists(path))
            throw new DirectoryNotFoundException(path);

        var files = Directory.GetFiles(path, "*" + number + "*",
           SearchOption.AllDirectories);

        if (files == null || files.Length == 0)
            return null;
        return files;
    

在使用通用应用时我遇到了一些问题:

Directory.Exists 不可用 如何从应用存储之外的目录中读取数据?

要从应用存储之外的其他目录读取,我尝试了以下操作:

StorageFolder folder = StorageFolder.GetFolderFromPathAsync("D:\\texts\\");
var fileTypeFilter = new string[]  ".pdf", ".jpg" ;
QueryOptions queryOptions = new QueryOptions(CommonFileQuery.OrderBySearchRank, fileTypeFilter);
queryOptions.UserSearchFilter = "142";
StorageFileQueryResult queryResult = folder.CreateFileQueryWithOptions(queryOptions);
IReadOnlyList<StorageFile> files = queryResult.GetFilesAsync().GetResults();

问题是:它不工作,但我得到一个例外:

TextManager.Universal.DataAccess.dll 中出现“System.UnauthorizedAccessException”类型的异常,但未在用户代码中处理 附加信息:访问被拒绝。 (来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))

我知道您必须在清单中配置一些权限,但我找不到适合文件系统 IO 操作的权限...

是否有人也有这样的问题/可能的解决方案?

解决方案: 从@Rico Suter 给我的解决方案中,我选择了 FutureAccessList 和 FolderPicker。也可以在程序重启后使用Token访问入口。

我还可以向您推荐UX Guidlines 和这个Github sample。

非常感谢!

【问题讨论】:

为什么要从应用存储之外的目录中读取?沙盒的存在是有原因的。 因为我想要一种简单的方法来更改文件。所以这意味着,没有办法因为沙盒? 【参考方案1】:

在 UWP 应用中,您只能访问以下文件和文件夹:

manifest file 中声明的目录(例如 Documents、Pictures、Videos 文件夹) 用户使用FileOpenPicker 或FolderPicker 手动选择的目录和文件 来自FutureAccessList or MostRecentlyUsedList 的文件 通过文件扩展名关联或通过共享打开的文件

如果您需要访问D:\ 中的所有文件,用户必须使用FolderPicker 手动选择D:\ 驱动器,然后您就可以访问此驱动器中的所有内容...

更新:

Windows 10 build 17134(2018 年 4 月更新,版本 1803)为 UWP 应用添加了额外的文件系统访问功能:

任何声明 AppExecutionAlias 的 UWP 应用程序(常规窗口应用程序或控制台应用程序)现在都被授予对当前工作目录中和向下的文件和文件夹的隐式访问权限,当它从命令激活时线。当前工作目录来自用户选择执行 AppExecutionAlias 的任何文件系统位置。

新的broadFileSystemAccess 功能授予应用程序与当前运行应用程序的用户相同的文件系统访问权限,而无需文件选择器样式提示。可以通过以下方式在清单中设置此访问权限:

    xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
    ...
    IgnorableNamespaces="uap mp uap5 rescap">
    ...
    <Capabilities>
      <rescap:Capability Name="broadFileSystemAccess" />
    </Capabilities>

在 MSDN 杂志标题为 Universal Windows Platform - Closing UWP-Win32 Gaps 的文章中详细讨论了这些更改及其意图。文章指出以下几点:

如果您声明任何受限功能,则会触发额外的 在您将包裹提交到商店时进行审查 出版物。 ...如果你有这个,你不需要AppExecutionAlias 能力。因为这是一个如此强大的功能,微软将 仅当应用程序开发人员提供引人注目的功能时才授予该功能 请求的原因,如何使用的描述,以及 解释这如何使用户受益。

进一步:

如果你声明了broadFileSystemAccess 能力,你不需要 声明任何范围更窄的文件系统功能 (文件、图片或视频);事实上,一个应用程序不能同时声明两者 broadFileSystemAccess 和其他三个文件系统中的任何一个 能力。

终于:

即使在应用被授予该功能后,还有一个 运行时检查,因为这构成了对 用户。就像其他隐私问题一样,该应用程序将触发 首次使用时的用户同意提示。如果用户选择拒绝 许可,应用程序必须对此有弹性。

【讨论】:

我想你可以让用户选择一次文件夹,然后把它放到FutureAccessList中,这样你以后就可以随时访问它了…… 文档库实际上无法访问,是吗?我认为它已在 Windows 10 中删除。 有没有办法破解它?模拟用户选择器?将磁盘分配为可移动存储?从图书馆访问它?我想从我的应用程序访问我树莓派上的所有文件......这太疯狂了,我不能这样做...... @user007:我希望没有办法绕过这个问题,因为这将是一个主要的安全问题...... @JamesM 这是经典桌面应用程序的安全问题,您是如何想到不受限制地访问所有文件(用户可以访问)不是安全风险的?但是,经典的桌面应用程序没有这种机制,因为在引入它们的时候,安全性并不是一个大话题,而且它们没有添加限制,因为在不破坏大多数现有软件的情况下基本上不可能做到这一点。跨度> 【参考方案2】:

接受的答案不再完整。现在可以在app manifest中声明broadFileSystemAccess来任意读取文件系统了。

File Access Permissions 页面有详细信息。

请注意,用户仍然可以通过设置应用撤销此权限。

【讨论】:

【参考方案3】:

你可以在 VS 2017 的 UI 中做到这一点。

点击清单文件 -> 功能 -> 检查照片库或任何你想要的东西。

【讨论】:

【参考方案4】:

根据 MSDN 文档:“文件选择器允许应用访问文件和文件夹、附加文件和文件夹、打开文件以及保存文件。”

https://msdn.microsoft.com/en-us/library/windows/apps/hh465182.aspx

您可以通过标准用户界面使用文件选择器读取文件。

问候

【讨论】:

【参考方案5】:

这不是真的: 使用文件扩展名关联或通过共享打开的文件 试试看,通过从邮件(outlook)或桌面打开文件... 它根本行不通 您首先必须通过文件选择器授予权限。 所以这就是...

【讨论】:

【参考方案6】:

这是一项受限功能。可在 设置 > 隐私 > 文件系统中配置访问权限。 并为您的应用启用访问权限。由于用户可以随时在“设置”中授予或拒绝该权限,因此您应确保您的应用能够适应这些更改。如果您发现您的应用没有访问权限,您可以选择通过提供指向 Windows 10 文件系统访问和隐私文章的链接来提示用户更改设置。请注意,用户必须关闭应用程序、切换设置并重新启动应用程序。如果他们在应用程序运行时切换设置,平台将暂停您的应用程序以便您可以保存状态,然后强制终止应用程序以应用新设置。在 2018 年 4 月的更新中,权限的默认值为开启。在 2018 年 10 月的更新中,默认为关闭。

More info

【讨论】:

以上是关于Windows 10 通用应用程序文件/目录访问的主要内容,如果未能解决你的问题,请参考以下文章

Windows 10 通用应用程序挂起崩溃并出现死锁

如何将windows目录共享给centos

在Linux系统中要查看用户账户文件,应输入命令

Windows 通用 C#:获取项目文件返回 FNFE

如何使用 Python 找到 Windows 通用应用程序数据文件夹?

Linux怎样访问Windows共享文件和文件夹