功能简介
我们的UWP程序想要读写本地的文件的时候,往往会遇到权限问题,这里存在着两个解决方法:
第一,电脑上的KnownFolder允许UWP程序直接访问,这篇博客将接受借助KnownFolder读取和保存图片;这里的KnowFolder指的是下面图片中的文件夹:
第二,UWP程序启动时生成的local,temp,roaming(漫游)文件夹,程序对这三个文件夹也具有直接访问权限(可以参考下一篇博客UWP——文件管理(二));
博客的示例程序将使用第一种方法,MainPage里有一个Image控件和一个Button控件,当启动程序的时候,Image控件将会进入KnownFolder中的图片文件夹,选中其中的图片(如示例图的detective978.jpg)初始化Image;点击按钮,会将Image的图片保存在KnownFolder的视频文件夹
实现效果
- 图片文件夹的内容
- 启动程序后Image控件读取图片文件夹的内容
- 点击按钮后Image的图片保存到视频文件夹中
实现过程
设置Package.appxmanifest文件
在解决方案资源管理器中找到Package.appxmanifest文件,点击打开,选择其中的功能,这里可以对UWP应用的各种功能提供权限,我们在图片库和视频库上打勾
在MainPage.xaml添加控件
<!-- MainPage.xaml -->
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel>
<Image x:Name="MyImage" Width="400" Height="600"></Image>
<Button Content="Save The Image" Click="Button_Click"></Button>
</StackPanel>
</Grid>
在MainPage.xaml.cs的构造函数上添加代码
//MainPage.xaml.cs
namespace KnownFolderSample
{
public sealed partial class MainPage : Page
{
//用于保存图片
StorageFile file;
public MainPage()
{
this.InitializeComponent();
SetImageSource();
}
//读取图片库里的图片并赋值给Image
private async void SetImageSource()
{
StorageFolder storageFolder = await KnownFolders.GetFolderForUserAsync(null, KnownFolderId.PicturesLibrary);
file = await storageFolder.GetFileAsync("detective978.jpg");
//将图片赋给右侧的Image
if (file != null)
{
BitmapImage bitmap = new BitmapImage();
using (var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
{
bitmap.SetSource(stream);
}
MyImage.Source = bitmap;
}
}
//点击按钮将图片保存在视频库里
private async void Button_Click(object sender, RoutedEventArgs e)
{
StorageFolder storageFolder = await KnownFolders.GetFolderForUserAsync(null, KnownFolderId.VideosLibrary);
await file.CopyAsync(storageFolder, "KnownFolder.jpg", NameCollisionOption.ReplaceExisting);
}
}
}
总结
整个项目其实是相当简单的,需要注意的地方有两个:
- 在开始的时候在Package.appxmanifest中提供权限
- 使用KnownFolders.GetFolderForUserAsync获得文件夹
FYI
项目下载:KnownFolderSample
项目下载之后记住把Debug模式从ARM换成X86或X64(根据你自己的机型选择),之前一开始学习的时候不知道这一点,从网上下载下来的项目都运行不了,纠结的一逼(╥╯^╰╥)