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
相关产品推荐
相关产品推荐

