You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在重启应用后保留通过FolderPicker获取的文件夹权限?

如何持久化UWP FolderPicker的文件夹访问权限?

这个问题在UWP开发里挺常见的——默认通过FolderPicker拿到的权限只是当前会话有效,重启应用就会丢失。要解决这个问题,你得用UWP提供的访问缓存机制,具体来说就是Windows.Storage.AccessCache命名空间下的两个核心工具:

核心方案:使用FutureAccessList或MostRecentlyUsedList

这两个列表的作用是帮你持久化对用户选择的文件/文件夹的访问权限,重启应用后可以通过唯一的token取回对应的存储对象。

1. FutureAccessList:主动持久化指定项目

适合你需要长期保留访问权限的场景,比如用户选择的工作目录。你可以手动管理里面的条目,默认最多支持1000个项目(可通过MaximumItemsAllowed调整)。

保存权限的代码修改

在你获取到文件夹后,把它加入FutureAccessList,并将生成的token保存到应用本地设置:

FolderPicker picker = new FolderPicker();
picker.FileTypeFilter.Add("*");
StorageFolder folder = await picker.PickSingleFolderAsync();

if (folder != null)
{
    // 将文件夹加入FutureAccessList,获取唯一标识token
    string accessToken = StorageApplicationPermissions.FutureAccessList.Add(folder);
    
    // 把token保存到本地设置,重启后可以读取
    ApplicationData.Current.LocalSettings.Values["PersistedFolderToken"] = accessToken;
}

重启后取回文件夹的代码

应用重启时,从本地设置读取token,再通过FutureAccessList取回文件夹:

// 尝试从本地设置读取保存的token
if (ApplicationData.Current.LocalSettings.Values.TryGetValue("PersistedFolderToken", out object tokenObj) 
    && tokenObj is string savedToken)
{
    try
    {
        // 通过token取回文件夹,恢复访问权限
        StorageFolder persistedFolder = await StorageApplicationPermissions.FutureAccessList.GetFolderAsync(savedToken);
        
        // 现在可以正常读取/创建文件了
        // 示例:创建一个测试文件
        StorageFile testFile = await persistedFolder.CreateFileAsync("RestartTest.txt", CreationCollisionOption.ReplaceExisting);
    }
    catch (FileNotFoundException)
    {
        // 异常情况:文件夹被删除/移动,或用户撤销了权限
        // 这里需要提示用户重新选择文件夹
        Console.WriteLine("目标文件夹无法访问,请重新选择");
    }
}

2. MostRecentlyUsedList:系统管理的最近访问列表

适合保存用户最近操作的项目,系统会自动管理条目数量(默认最多25个),当超过限制时会自动移除最早的条目。用法和FutureAccessList几乎一致,只是替换成StorageApplicationPermissions.MostRecentlyUsedList即可:

// 保存到最近使用列表
string mruToken = StorageApplicationPermissions.MostRecentlyUsedList.Add(folder);
// 取回时
StorageFolder mruFolder = await StorageApplicationPermissions.MostRecentlyUsedList.GetFolderAsync(mruToken);

注意事项

  • 权限不是永久的:如果用户手动在系统设置中撤销了应用对该文件夹的权限,或者文件夹被删除/移动,调用GetFolderAsync会抛出FileNotFoundException,一定要做好异常处理。
  • 条目数量限制:不要无限制地往缓存列表里加项目,根据你的需求选择合适的列表,避免占用不必要的系统资源。

内容的提问来源于stack exchange,提问作者user7342089

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:41:12