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

UWP(C++)加载并显示本地任意视频的实现疑问

解答你的UWP视频加载权限问题

先直接回应你的两个疑问,再给你适配UWP环境的优化建议:

1. 关于CopyFileA()能否完成文件复制

理论上可以调用Win32的CopyFileA完成复制,但这并非UWP环境下的最优选择,甚至可能踩权限坑:

  • UWP是沙箱运行环境,虽然通过FileOpenPicker选中文件后应用获得了该文件的临时访问权限,但直接用Win32 API操作绝对路径,在部分受系统保护的目录下可能因权限上下文不匹配失败。
  • 更稳妥的方式是使用UWP原生的StorageFile.CopyAsync()方法,它完全适配沙箱权限模型,代码逻辑也更简洁可靠。

给你替换这部分的示例代码:

create_task(fop->PickSingleFileAsync()).then([this](StorageFile^ file) {
    if (file) {
        auto localFolder = Windows::Storage::ApplicationData::Current->LocalFolder;
        // 用UWP原生API完成复制,自动处理权限与路径逻辑
        create_task(file->CopyAsync(localFolder, file->Name, NameCollisionOption::ReplaceExisting))
            .then([this](StorageFile^ copiedFile) {
                if (copiedFile) {
                    txtBlockOutput->Text = "File is copied into local directory";
                    // 用ms-appdata协议构造Uri,这是UWP访问本地数据目录的标准方式
                    _media->Source = ref new Uri("ms-appdata:///local/" + copiedFile->Name);
                } else {
                    txtBlockOutput->Text = "File didn't copy";
                }
            });
    } else {
        txtBlockOutput->Text = "Operation cancelled.";
    }
});

2. 能否将文件复制到应用的Assets目录?

绝对不行,因为Assets目录属于应用的安装目录,UWP应用对安装目录只有只读权限,完全无法写入、修改或删除其中的文件。

如果你需要持久化存储视频文件,推荐继续使用LocalFolder(你当前代码里的ApplicationData::Current->LocalFolder),或者LocalCacheFolder(适合存放临时文件)。加载时用上面示例里的ms-appdata:///local/协议即可,MediaElement能正常识别这个路径。

另外补充一个小细节:你原来的代码里用本地绝对路径直接构造Uri是不符合UWP规范的,容易触发沙箱权限限制,改用ms-appdata协议才是正确的做法。

内容的提问来源于stack exchange,提问作者Carlos Hernandez Perez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:46:46