提问者:小点点

Windows 10 Universal App文件/目录访问


IM开发一个应用程序,从文件系统上的可配置位置读取jpeg和pdf文件。目前有一个在WPF中实现的运行版本,现在IM正在尝试转移到新的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;
    }

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

    不可用

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

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

我还可以向您推荐用户体验指南和这个Github示例。

非常感谢!


共3个答案

匿名用户

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

  • 使用文件扩展名关联或通过共享打开的文件/li>

如果您需要访问中的所有文件,用户必须使用FolderPicker手动选择驱动器,则您可以访问该驱动器中的所有文件。

更新:

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

> ,当它从命令行激活时,它现在被授予对当前工作目录及其下的文件和文件夹的隐式访问权限。当前工作目录来自用户选择执行AppExecutionAlias的任何文件系统位置。

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

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

MSDN杂志题为“通用Windows平台--缩小UWP-Win32差距”的文章详细讨论了这些更改及其意图。条款规定如下:

如果您声明了任何受限制的功能,那么在您将包提交到存储以便发布时,这将触发额外的检查。。。。如果您有此功能,就不需要。因为这是一个如此强大的功能,只有当应用程序开发人员提供令人信服的请求理由,说明如何使用这一功能,并解释这将如何使用户受益时,微软才会授予该功能。

进一步:

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

最后:

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

匿名用户

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

“文件访问权限”页包含详细信息。

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

匿名用户

你可以在VS 2017中从UI来做。

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