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

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

以下代码适用于WPF:

public IList 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 files = queryResult.GetFilesAsync().GetResults(); 

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

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

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

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

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

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

非常感谢你!

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

  • 在清单文件中声明的目录 (例如,文档,图片,video文件夹)
  • 用户使用FileOpenPicker或FolderPicker手动选择的目录和文件
  • FutureAccessList或MostRecentlyUsedList中的文件
  • 使用文件扩展名关联或通过共享打开的文件

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

更新:

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

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

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

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

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

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

进一步:

如果声明broadFileSystemAccessfunction,则无需声明任何更窄范围的文件系统function(文档,图片或video); 实际上,应用程序不得声明broadFileSystemAccess和任何其他三个文件系统function。

最后:

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

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

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

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

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

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

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

问候

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