C# Windows 10通用应用程序文件/目录访问
我正在开发一个应用程序,可以从文件系统上的可配置位置读取jpeg和pdf文件。 目前有一个运行版本是在WPF中实现的,现在我正在尝试使用新的Windows通用应用程序 以下代码适用于WPF:C# Windows 10通用应用程序文件/目录访问,c#,wpf,win-universal-app,C#,Wpf,Win Universal App,我正在开发一个应用程序,可以从文件系统上的可配置位置读取jpeg和pdf文件。 目前有一个运行版本是在WPF中实现的,现在我正在尝试使用新的Windows通用应用程序 以下代码适用于WPF: public IList<string> GetFilesByNumber(string path, string number) { if (string.IsNullOrWhiteSpace(path)) throw new ArgumentN
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;
}
问题是:它不起作用,但我有一个例外:
TextManager.Universal.DataAccess.dll中发生“System.UnauthorizedAccessException”类型的异常,但未在用户代码中处理
其他信息:访问被拒绝。(HRESULT异常:0x80070005(E_访问被拒绝))
我知道您必须在清单中配置一些权限,但我找不到适合文件系统IO操作的权限
有人也有这样的问题/可能的解决方案吗
解决方案:
根据@Rico Suter给我的解决方案,我选择了FutureAccessList和FolderPicker。也可以在程序重新启动后使用令牌访问条目
我也可以向你推荐这个和这个
多谢各位 在UWP应用程序中,您只能访问以下文件和文件夹:
- 在中声明的目录(例如文档、图片、视频文件夹)
- 用户使用或手动选择的目录和文件
- 来自
- 使用文件扩展名关联或通过共享打开的文件
D:\
中的所有文件,则用户必须使用FolderPicker手动选择D:\
驱动器,然后您可以访问此驱动器中的所有文件
更新:
Windows 10 build 17134(2018年4月更新,版本1803)为UWP应用程序添加了额外的文件系统访问功能:
- 任何UWP应用程序(常规窗口应用程序或控制台应用程序)如果声明了
,现在都被授予隐式访问当前工作目录中的文件和文件夹以及从命令行激活时向下访问的权限。当前工作目录来自用户选择执行AppExecutionAlias的任何文件系统位置appexecutionalas
- 新的
功能授予应用程序与当前运行应用程序的用户相同的文件系统访问权限,而无需文件选择器样式的提示。可通过以下方式在清单中设置此访问权限:broadFileSystemAccess
xmlns:rescap=”http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
...
IgnorableNamespaces=“uap mp uap5 rescap”>
...
这些变化及其意图在MSDN杂志标题为的文章中进行了详细讨论。文章指出:
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();
如果您声明任何受限制的功能,这将触发额外的
在您向商店提交包裹进行检查时进行详细检查
出版如果您有此功能,则不需要appexecutionalisas
能力。因为这是一个如此强大的功能,微软将
仅当应用程序开发人员提供令人信服的
请求的原因、如何使用的说明,以及
说明这对用户有何好处
进一步:
如果您声明了broadFileSystemAccess
功能,则无需
声明任何范围更窄的文件系统功能
(文件、图片或视频);事实上,一个应用程序不能同时声明这两者
broadFileSystemAccess
和其他三个文件系统中的任意一个
能力
最后:
即使在该应用程序被授予该功能后,也有一个
运行时检查,因为这对
用户。就像其他隐私问题一样,该应用程序将触发
首次使用时的用户同意提示。如果用户选择拒绝
许可,应用程序必须对此具有弹性
根据MSDN文档:“文件选择器允许应用程序访问文件和文件夹、附加文件和文件夹、打开文件和保存文件。”
您可以通过标准用户界面使用文件选择器读取文件
关于这不是真的:
使用文件扩展名关联或通过共享打开的文件
尝试一下,从邮件(outlook)或桌面打开文件。。。
它根本不起作用
首先必须由文件选择器授予权限。
因此,这是一个答案。被接受的答案不再完整。现在可以在应用程序清单中声明
broadFileSystemAccess
,以任意读取文件系统
该页面有详细信息
请注意,用户仍然可以通过设置应用程序撤消此权限。您可以在VS 2017的UI中执行此操作 点击清单文件->功能->检查照片库或任何你想要的东西
这是一种受限功能。访问可在设置>隐私>文件系统中配置。并为应用程序启用帐户。因为用户可以在设置中随时授予或拒绝权限,所以您应该确保您的应用程序能够适应这些更改。如果您发现您的应用程序没有访问权限,您可以选择通过提供指向Windows 10文件系统访问和隐私文章的链接来提示用户更改设置。请注意,用户必须关闭应用程序,切换设置,然后重新启动应用程序。如果他们在应用程序运行时切换设置,平台将暂停您的应用程序,以便您保存状态,然后强制终止应用程序以应用新设置。在2018年4月的更新中,权限的默认值为On。在2018年10月的更新中,默认设置为关闭
为什么要从应用程序存储区之外的目录中读取?沙盒的存在是有原因的。因为我想要一种简单的方法来更改文件。那么这个