UWP应用中数据库文件复制权限异常及正确实现方式咨询
UWP应用中数据库文件复制权限异常及正确实现方式咨询
嗨,这个权限拒绝的问题其实是UWP的沙箱机制导致的,咱们一步步来解决它~
首先得明白:UWP应用运行在沙箱环境里,不能直接通过文件路径(比如result.FullPath)去访问用户选择的文件,哪怕用FileInfo这种传统.NET文件操作类也不行——这些类没有UWP沙箱的访问权限。而FilePicker返回的FileResult里的文件对象,是带有临时访问权限的StorageFile,咱们得用UWP专属的文件API来处理复制操作才行。
下面是正确的实现步骤和代码:
- 直接使用
FileResult里的StorageFile对象,而非通过路径去创建FileInfo - 调用
StorageFile.CopyAsync方法完成复制,这个方法是符合UWP沙箱权限规则的标准异步操作
修改后的代码示例如下:
async Task<FileResult> PickAndShow(PickOptions options) { var result = await FilePicker.PickAsync(options); if (result != null && result.FileName.EndsWith("db", StringComparison.OrdinalIgnoreCase)) { try { // 获取UWP应用官方推荐的本地存储文件夹 var localAppFolder = ApplicationData.Current.LocalFolder; // 复制文件到目标文件夹,第二个参数控制同名文件的处理逻辑 await result.File.CopyAsync(localAppFolder, result.FileName, NameCollisionOption.ReplaceExisting); } catch (Exception ex) { // 这里可以添加异常日志或给用户的提示信息 Debug.WriteLine($"文件复制失败:{ex.Message}"); } } return result; }
几个关键细节说明:
result.File是FilePicker返回的带权限的StorageFile对象,用它操作才不会触发权限拒绝NameCollisionOption.ReplaceExisting表示如果目标文件夹已有同名文件就覆盖,你也可以换成NameCollisionOption.GenerateUniqueName自动生成新文件名,或者NameCollisionOption.FailIfExists让复制直接失败,根据业务需求调整即可- 如果你的
App.APPFOLDER不是默认的本地存储文件夹,也可以用StorageFolder.GetFolderFromPathAsync获取对应文件夹的StorageFolder对象,但要确保这个路径是UWP应用有权限访问的(比如本地文件夹、漫游文件夹这类官方允许的存储位置)
备注:内容来源于stack exchange,提问作者user21587900
相关产品推荐
相关产品推荐

