UWP C#应用在文件资源管理器打开指定文件夹失败问题咨询
在UWP C#应用中打开本地文件夹的正确方法
我来帮你搞定这个困扰你的问题~你之前用LaunchFolderAsync和LaunchUriAsync失败,主要是UWP的安全权限机制在起作用,下面我给你拆解原因和解决方案:
为什么之前的方法不生效?
- LaunchFolderAsync的问题:它需要传入
StorageFolder对象,但UWP默认只能访问系统预设的文件夹(比如文档、下载、图片库),像C:\myprojects\project1这种自定义路径,直接获取StorageFolder会因为权限不足被拦截。 - LaunchUriAsync的问题:首先你用的URI格式不对,正确的本地文件URI应该是
file:///C:/myprojects/project1(三个斜杠,反斜杠转成正斜杠),但就算格式对了,UWP的安全策略也禁止应用直接通过URI访问任意本地文件夹,所以还是会失败。
可行的解决方案
方案1:通过文件选择器获取权限(推荐,无商店审核风险)
这种方法是让用户手动选择一次目标文件夹,之后应用就能保存这个文件夹的访问权限,后续可以直接打开:
// 第一步:弹出文件夹选择器让用户选择目标文件夹 var folderPicker = new Windows.Storage.Pickers.FolderPicker(); folderPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.Desktop; folderPicker.FileTypeFilter.Add("*"); // 允许选择任意类型的文件夹 var selectedFolder = await folderPicker.PickSingleFolderAsync(); if (selectedFolder != null) { // 把文件夹保存到FutureAccessList,后续可以直接调用 string folderToken = Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.Add(selectedFolder); // 立即打开文件夹 await Windows.System.Launcher.LaunchFolderAsync(selectedFolder); } // 后续需要打开时,直接从FutureAccessList获取 if (Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.ContainsItem(folderToken)) { var targetFolder = await Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.GetFolderAsync(folderToken); await Windows.System.Launcher.LaunchFolderAsync(targetFolder); }
方案2:使用Broad File System Access权限(适合需要直接访问自定义路径的场景)
这个权限允许应用访问整个文件系统,但属于受限权限,需要注意两点:一是用户要手动开启系统权限,二是提交商店时需要说明用途。
- 首先修改
Package.appxmanifest文件,添加权限声明:
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" IgnorableNamespaces="rescap"> <!-- 其他原有内容 --> <Capabilities> <!-- 添加这个受限权限 --> <rescap:Capability Name="broadFileSystemAccess" /> </Capabilities> </Package>
- 然后在代码中直接获取文件夹并打开:
try { var targetFolder = await Windows.Storage.StorageFolder.GetFolderFromPathAsync(@"C:\myprojects\project1"); await Windows.System.Launcher.LaunchFolderAsync(targetFolder); } catch (UnauthorizedAccessException ex) { // 这里捕获权限异常,提示用户去设置开启权限 // 可以弹窗引导用户到 设置 > 隐私和安全性 > 文件系统 开启应用的文件访问权限 }
注意事项
- 方案1是UWP推荐的权限获取方式,符合系统安全模型,不会有商店审核问题。
- 方案2的权限默认是关闭的,必须让用户手动在系统设置中开启,而且提交微软商店时需要详细说明应用为什么需要访问整个文件系统,否则可能被拒。
内容的提问来源于stack exchange,提问作者Carlo Mendoza
相关产品推荐
相关产品推荐

