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

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里声明对应的功能权限:

    1. 打开Package.appxmanifest文件,切换到「功能」选项卡;
    2. 勾选你需要访问的库(比如「文档库」「图片库」);
    3. 注意:这些属于受限权限,提交到微软商店时需要详细说明使用场景,否则可能被拒绝。
  • 添加用户自定义文件夹:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:15:40