个人资料

跳过导航链接首页 > 博客列表 > 博客正文

UWP读取写入文件权限之_获取任意文件夹/文件权限

分类:

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"));

========

另外的就是其他一些特殊文件夹,比如:音乐库,图片库,文档....;相机照片存储文件夹: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();
参考:https://docs.microsoft.com/en-us/uwp/api/Windows.Storage.AccessCache.StorageApplicationPermissions?redirectedfrom=MSDN#Windows_Storage_AccessCache_StorageApplicationPermissions_MostRecentlyUsedList

---

众所周知,微软脑袋缺根筋,即使是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;
	}

}



songshizhao
最初发表2019/10/12 21:06:23 最近更新2019/11/9 1:30:42 111
为此篇作品打分
10
   评论