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

问题描述 投票:22回答:6

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

以下代码在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;
    }

使用Universal Apps,我遇到了一些问题:

  • 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结合使用。程序重新启动后,也可以使用令牌访问该条目。

我也可以向您推荐UX Guidlines和此Github sample

非常感谢!

c# wpf win-universal-app
6个回答
48
投票

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

  • manifest file中声明的目录(例如,Documents,Pictures,Videos文件夹)
  • 用户用FileOpenPickerFolderPicker手动选择的目录和文件
  • [C0中的文件]
  • 通过文件扩展名关联或通过共享打开的文件

如果您需要访问FutureAccessList or MostRecentlyUsedList中的所有文件,则用户必须使用FolderPicker手动选择D:\驱动器,然后您才能访问该驱动器中的所有内容...

UPDATE:

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

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

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

broadFileSystemAccess

这些更改及其意图在《 MSDN杂志》标题为 xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" ... IgnorableNamespaces="uap mp uap5 rescap"> ... <Capabilities> <rescap:Capability Name="broadFileSystemAccess" /> </Capabilities> 的文章中进行了详细讨论。文章注意以下内容:

如果您声明任何受限功能,则会触发其他在您将包裹提交给商店时进行仔细检查出版物。 ...如果您有这个,则不需要Universal Windows Platform - Closing UWP-Win32 Gaps能力。由于这是一个强大的功能,因此Microsoft会仅在应用程序开发人员提供引人注目的情况下才授予此功能请求的原因,如何使用的说明以及有关如何使用户受益的说明。

进一步:

如果您声明AppExecutionAlias功能,则无需声明任何范围更窄的文件系统功能(文件,图片或视频);实际上,应用程序不得同时声明两者broadFileSystemAccess和其他三个文件系统中的任何一个功能。

最终:

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


4
投票

接受的答案不再完整。现在可以在应用清单中声明broadFileSystemAccess以任意读取文件系统。

broadFileSystemAccess页面包含详细信息。

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


0
投票

根据MSDN doc:“文件选择器允许应用访问文件和文件夹,附加文件和文件夹,打开文件并保存文件。”

File Access Permissions

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

问候


0
投票

这是不正确的:通过文件扩展名关联或共享打开的文件尝试打开邮件(外观)或桌面中的文件...它根本不起作用您首先必须通过文件选择器授予权限。所以这个ist……


0
投票

您可以在VS 2017中通过UI进行操作。


0
投票

这是受限制的功能。访问权限可在设置>隐私>文件系统。

© www.soinside.com 2019 - 2024. All rights reserved.