UWP对文件/文件夹读取写入具有很强的权限管理.
对于一个app来说,天然拥有一个文件夹的读取和写入权限,那就是
========
ApplicationData.Current.LocalFolder
这个文件夹不在安装包内,一般存储到用户文档中.APP可以随意读取写入这个文件夹里面的文件,具有全部权限.
甚至可以直接打开资源管理器查看这个文件夹
public static async void CheckLocalFileInExplorer() { var MyFolderLauncherOptions = new FolderLauncherOptions(); StorageFolder folder = ApplicationData.Current.LocalFolder; await Launcher.LaunchFolderAsync(folder, MyFolderLauncherOptions); }
========
另外还有一个文件夹也比较特殊,那就是程序安装后所存储的文件夹,安装后禁止更改,只具有读取权限.可以通过下面的方式读取:
file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri(@"ms-appx:///Helper\Default.rtf"));
总的文件安装目录路径:
Windows.ApplicationModel.Package.Current.InstalledLocation
========
另外的就是其他一些特殊文件夹,比如:音乐库,图片库,文档....;相机照片存储文件夹:KnownFolders.CameraRoll
同时注意,为了使用这些特殊文件夹,app必须在manifest的功能权限说明中勾选相应权限,才具有读取这些特殊文件夹的权限,这样用户在安装之前在store简介中就可以知晓,app申请什么样的权限.个人认为除了是开发播放器获取音乐库,相册获取图片库,这种开发,其他的还是老老实实用ApplicationData.Current.LocalFolder这个文件夹就可以了.
当然了一般的我还是会吧这些权限勾选上,我可以不用,但是要有🤭.
========
最后最后,任意文件夹,uwp当然可以获取其他文件夹/文件权限,只不过要麻烦一些,就是必须要用户通过Picker选择文件/文件下,然后存储他们的权限token,然后通过token来获取权限.获取token只需要一次.
大概意思就是需要用户授权一次,然后以后就可以一直使用了.
那么具体过程是
1.先调用Picker获取文件或者文件夹权限
2.存储token
3.如果下次使用
用法:
var dialog = new MessageDialog(AppResources.GetString("请求文件夹权限说明"), AppResources.GetString("请求文件夹权限标题")); dialog.Commands.Add(new UICommand(AppResources.GetString("请求权限获取"), async cmd => { FolderPicker fPicker = new FolderPicker(); fPicker.FileTypeFilter.Add(".txt"); fPicker.FileTypeFilter.Add(".rtf"); fPicker.FileTypeFilter.Add(".md"); var selectedFolder=await fPicker.PickSingleFolderAsync(); if (selectedFolder != null) { string mruToken = Windows.Storage.AccessCache.StorageApplicationPermissions.MostRecentlyUsedList.Add(file, "20120716"); var faToken1 = StorageApplicationPermissions.FutureAccessList.Add(selectedFolder); } }, commandId: 0)); dialog.Commands.Add(new UICommand(AppResources.GetString("请求权限拒绝"), cmd => { }, commandId: 1)); //设置默认按钮,不设置的话默认的确认按钮是第一个按钮 dialog.DefaultCommandIndex = 0; dialog.CancelCommandIndex = 1; //获取返回值 var result = await dialog.ShowAsync();
---
众所周知,微软脑袋缺根筋,即使是token也分两种,一种mru_token另一种fa_token.只能根据名字,
mru=most rencently used 最近使用过的文件,
fa=future list未来的权限列表
一个代表过去,一个代表未来,好厉害的样子.然而权限token就是权限token,实际体验下来并不能发现这两种token到底有什么区别.
===
后记:
mru最多存储25条,由windows自动管理,fa最多1000条,只能用代码管理.区别在这里
===
获取token之后存储下来,然后下次访问就不需要用户选择了.
示例代码:
//获取工作文件夹 public static async Task<StorageFolder> GetWorkFolder() { UserSetting Us = new UserSetting(); if (Us.WorkFolderToken.Length>0) { try { StorageFolder folder =await StorageApplicationPermissions.FutureAccessList.GetFolderAsync(Us.WorkFolderToken); return folder; } catch (Exception ex) { Debug.WriteLine(ex.Message); return ApplicationData.Current.LocalFolder; } } else { return ApplicationData.Current.LocalFolder; } }