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的任何文件系统位置。 -
新的
broadFileSystemAccess
function授予应用程序与文件系统相同的访问权限,与当前正在运行应用程序而没有文件选择器样式提示的用户相同。 可以通过以下方式在清单中设置此访问权限:
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,说明如何使用该请求,以及如何使用户受益的说明。
进一步:
如果声明
broadFileSystemAccess
function,则无需声明任何更窄范围的文件系统function(文档,图片或video); 实际上,应用程序不得声明broadFileSystemAccess
和任何其他三个文件系统function。
最后:
即使在应用程序被授予该function之后,也会进行运行时检查,因为这构成了用户的隐私问题。 与其他隐私问题一样,该应用程序将在首次使用时触发用户同意提示。 如果用户选择拒绝权限,则应用程序必须具有弹性。
接受的答案已不再完整。 现在可以在应用程序清单中声明broadFileSystemAccess
以任意读取文件系统。
“ 文件访问权限”页面包含详细信息。
请注意,用户仍可以通过设置应用撤消此权限。
根据MSDN doc:“文件选择器允许应用程序访问文件和文件夹,附加文件和文件夹,打开文件,以及保存文件。”
https://msdn.microsoft.com/en-us/library/windows/apps/hh465182.aspx
您可以通过标准用户界面使用filepicker读取文件。
问候
事实并非如此:通过文件扩展名关联或通过共享打开的文件通过从邮件(outlook)或桌面打开文件来尝试它…它根本不起作用您首先必须通过文件授予权限选择器。 所以这就是……