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

时间:2015-10-12 13:47:10

标签: c# wpf win-universal-app

我正在开发一个从文件系统上的可配置位置读取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

非常感谢!

6 个答案:

答案 0 :(得分:48)

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

如果您需要访问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以及其他三个文件系统   能力。

最后:

  

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

答案 1 :(得分:4)

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

File Access Permissions页面包含详细信息。

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

答案 2 :(得分:0)

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

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

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

此致

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

enter image description here

答案 5 :(得分:0)

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

More info