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;
}
}