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示例。
非常感谢!
在UWP应用程序中,您只能访问以下文件和文件夹:
如果您需要访问
更新:
Windows 10 build 17134(2018年4月更新,1803版)为UWP应用增加了额外的文件系统访问功能:
>
新的
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来做。
单击清单文件-&>;功能-&>;检查照片库或任何你想要的东西。