启用broadFileSystemAccess后UWP应用访问关联文件仍被拒绝如何解决
问题原因及解决方案
1. 核心错误:路径拼接逻辑错误
你当前代码中生成音频路径的逻辑完全错误:file.Path 是txt文件的完整路径(例如 D:\文档\Class1.txt),直接拼接 \ 和文件名会生成类似 D:\文档\Class1.txt\Class1.mp3 的非法路径,这是触发报错的首要原因。
正确逻辑是先获取txt文件所在的父目录,再从父目录中查找同名mp3文件。
2. 权限配置的常见误区
即使你在清单文件中声明了 broadFileSystemAccess 权限,也需要满足两个前提才能生效:
- 清单文件中必须正确声明受限能力的命名空间,示例配置如下:
<Package ... xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" IgnorableNamespaces="uap mp rescap"> <Capabilities> <rescap:Capability Name="broadFileSystemAccess" /> </Capabilities> </Package>
- 用户需要手动在系统设置中为你的应用开启文件系统访问权限:设置 → 隐私和安全性 → 文件系统 → 找到对应应用,开启「允许访问此设备上的文件系统」选项。
注意:实际上你不需要申请
broadFileSystemAccess即可实现该需求:通过FileOpenPicker选中文件后,UWP 会自动授予你该文件所在父目录的访问权限,直接通过父目录读取同路径下的音频文件即可,无需额外申请全文件系统权限。
3. 修正后的核心代码
private async void nviOpen_Tapped(object sender, TappedRoutedEventArgs e) { FileOpenPicker openPicker = new FileOpenPicker(); openPicker.ViewMode = PickerViewMode.Thumbnail; openPicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary; openPicker.FileTypeFilter.Add(".txt"); StorageFile file = await openPicker.PickSingleFileAsync(); if (file != null) { try { using (var txtStream = await file.OpenStreamForReadAsync()) { var encoding = FileEncoding.DetectFileEncoding(txtStream); txtStream.Seek(0, SeekOrigin.Begin); var stmReader = new StreamReader(txtStream, encoding); var txtContent = await stmReader.ReadToEndAsync(); tbxOriginalText.Text = txtContent; } // 修正后的音频文件读取逻辑:先取父目录,再查找同名mp3 StorageFolder parentFolder = await file.GetParentAsync(); string audioFileName = $"{file.DisplayName}.mp3"; StorageFile audioFile = await parentFolder.GetFileAsync(audioFileName); if (audioFile != null) { MediaPlaybackItem mediaPlaybackItem = new MediaPlaybackItem(MediaSource.CreateFromStorageFile(audioFile)); // 后续添加播放器加载逻辑即可 } } catch (Exception ex) { MessageDialog msgDlg = new MessageDialog(ex.Message); await msgDlg.ShowAsync(); } } }
内容的提问来源于stack exchange,提问作者Jose Afonso Braga
相关产品推荐
相关产品推荐

