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

启用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:27:04