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

Whi*_*tel 22 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;
    }
Run Code Online (Sandbox Code Playgroud)

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

  • 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();
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

解决方案: 从@Rico Suter给我的解决方案中,我选择了FutureAccessList和FolderPicker.重新启动程序后,也可以使用令牌访问该条目.

我还可以向您推荐UX Guidlines和这个Github示例.

非常感谢你!

Ric*_*ter 48

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

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

更新:

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

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

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

    xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
    ...
    IgnorableNamespaces="uap mp uap5 rescap">
    ...
    <Capabilities>
      <rescap:Capability Name="broadFileSystemAccess" />
    </Capabilities>
Run Code Online (Sandbox Code Playgroud)

这些更改及其意图将在MSDN杂志的文章" Universal Windows Platform - Closing UWP-Win32 Gaps"中详细讨论.文章注意到以下内容:

如果您声明任何受限制的功能,则会在您将包提交到商店进行发布时触发额外的审查.... AppExecutionAlias如果您具备此功能,则不需要.由于这是一个非常强大的功能,只有当应用程序开发人员提供有关请求的令人信服的理由时,Microsoft才会授予此功能,说明如何使用该请求,以及如何使用户受益的说明.

进一步:

如果声明该broadFileSystemAccess功能,则无需声明任何更窄范围的文件系统功能(文档,图片或视频); 实际上,应用程序不得声明两者 broadFileSystemAccess以及任何其他三种文件系统功能.

最后:

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

  • 我想你可以让用户选择一次文件夹,然后把它放到FutureAccessList中,以便以后随时可以访问它... (3认同)
  • 文档库实际上不可访问,是吗?我认为它已在Windows 10中删除. (2认同)
  • 有没有办法破解它?模拟用户选择器?将磁盘分配为可移动存储?从图书馆访问它?我想从我的应用程序访问我的覆盆子pi上的所有文件...这是疯狂,我不能这样做... (2认同)

Sam*_*Sam 5

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

文件访问权限页面有更多的细节。

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