C# UWP:获取应用有权限访问的文件夹列表及相关操作问询
我来帮你梳理下C# UWP里关于文件夹权限的这几个问题,都是日常开发中高频遇到的场景:
一、获取应用有权限访问的文件夹列表
UWP应用的权限文件夹主要分两类,获取方式各有不同:
系统默认授权的已知文件夹:只要你在应用清单里声明了对应权限,就能直接通过
KnownFolders类获取。比如文档库、图片库这些,代码示例:// 获取所有常用的已知文件夹 var accessibleFolders = new List<StorageFolder>(); accessibleFolders.Add(KnownFolders.DocumentsLibrary); accessibleFolders.Add(KnownFolders.PicturesLibrary); accessibleFolders.Add(KnownFolders.VideosLibrary); accessibleFolders.Add(KnownFolders.MusicLibrary); // 遍历输出名称 foreach (var folder in accessibleFolders) { Debug.WriteLine($"有权限的系统文件夹:{folder.Name}"); }用户手动授权的自定义文件夹:这些是用户通过文件选择器授予权限的文件夹,我们可以通过系统提供的
FutureAccessList或MostRecentlyUsedList来获取已保存的权限条目:// 遍历FutureAccessList里的所有授权文件夹 var futureAccessEntries = StorageApplicationPermissions.FutureAccessList.Entries; foreach (var entry in futureAccessEntries) { try { var folder = await StorageApplicationPermissions.FutureAccessList.GetFolderAsync(entry.Token); Debug.WriteLine($"用户授权的文件夹:{folder.Name},Token:{entry.Token}"); } catch (Exception ex) { // 权限可能已被用户撤销,处理异常 Debug.WriteLine($"获取文件夹失败:{ex.Message}"); } }
二、向权限列表添加新文件夹
同样分两种场景处理:
添加系统已知文件夹(如Documents、Pictures):
不需要用户手动选择,只需要在应用的Package.appxmanifest里声明对应的功能权限:- 打开Package.appxmanifest文件,切换到「功能」选项卡;
- 勾选你需要访问的库(比如「文档库」「图片库」);
- 注意:这些属于受限权限,提交到微软商店时需要详细说明使用场景,否则可能被拒绝。
添加用户自定义文件夹:
UWP遵循「用户授权」原则,必须让用户主动通过FolderPicker选择文件夹,然后将其添加到权限列表中。代码示例:var folderPicker = new FolderPicker(); // 设置文件类型过滤,*表示允许选择所有类型的文件夹 folderPicker.FileTypeFilter.Add("*"); // 弹出选择器,等待用户选择 var selectedFolder = await folderPicker.PickSingleFolderAsync(); if (selectedFolder != null) { // 将文件夹添加到FutureAccessList,获取持久化的Token string token = StorageApplicationPermissions.FutureAccessList.Add(selectedFolder); // 可以把Token保存到本地设置,方便后续快速访问 ApplicationData.Current.LocalSettings.Values["CustomFolderToken"] = token; Debug.WriteLine("文件夹已成功添加到权限列表"); }
三、让权限列表在应用启动间持久化
核心就是利用UWP内置的StorageApplicationPermissions.FutureAccessList和MostRecentlyUsedList,这两个是系统维护的持久化存储,专门用来保存用户授予的文件/文件夹访问权限:
- 保存权限:当用户选择文件夹后,调用
AddAsync方法将其加入列表,返回的Token可以存在ApplicationData.Current.LocalSettings或其他本地存储中(FutureAccessList本身也会自动持久化这些条目)。 - 恢复权限:应用重启后,通过保存的Token重新获取文件夹:
// 从本地设置获取之前保存的Token if (ApplicationData.Current.LocalSettings.Values.TryGetValue("CustomFolderToken", out var tokenObj) && tokenObj is string token) { try { var folder = await StorageApplicationPermissions.FutureAccessList.GetFolderAsync(token); // 现在可以正常访问这个文件夹了 Debug.WriteLine($"恢复权限成功,文件夹:{folder.Name}"); } catch (Exception ex) { // 权限可能被用户撤销,或者Token失效,需要重新引导用户授权 Debug.WriteLine($"恢复权限失败:{ex.Message}"); } }
额外注意事项
FutureAccessList默认最多保存1000个条目,你可以通过StorageApplicationPermissions.FutureAccessList.MaximumItemsAllowed调整上限;MostRecentlyUsedList是最近使用列表,默认最多25个条目,适合记录用户常用的文件/文件夹;- 如果用户在系统设置里撤销了应用的权限,对应的Token会失效,此时需要捕获异常并重新引导用户授权。
内容的提问来源于stack exchange,提问作者Bimo
相关产品推荐
相关产品推荐

