背景简介
我们的UWP程序想要读写本地的文件的时候,往往会遇到权限问题,这里存在着两个解决方法:
第一,电脑上的KnownFolder允许UWP程序直接访问;这里的KnowFolder指的是下面图片中的文件夹:
关于这种方法可以参考第一篇博客,本片博客将主要介绍第二中方法
第二,UWP程序启动时生成的local,temp,roaming(漫游)文件夹,程序对这三个文件夹也具有直接访问权限;当需要访问这些文件夹是,需要在添加ms-appdata:///前缀,如
文件夹 | 前缀 |
---|---|
local | ms-appdata:///local/ |
roaming | ms-appdata:///roaming/ |
temp | ms-appdata:///temp/ |
当需要获取local文件夹中的AppConfig.xml文件时,可以使用下面的代码:
var file = await Windows.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/AppConfig.xml"));
至于这些文件夹的路径在哪里,我们可以通过下面的代码找到:
StorageFolder localFolder = ApplicationData.Current.LocalFolder;
Debug.WriteLine(localFolder.Path);
这是程序自动生成的一个目录,每个人的路径应该都不一样
功能简介
博客示例代码有一个页面MainPage,MainPage里有一个Image控件和一个按钮,点击按钮,将可以从本地选择图片,选好图片后Image将更新,同时该图片将被复制到程序的local文件夹中(如何得到local文件夹的路径看上面)
实现效果
- 程序启动时
- 选择一张图片
- 在本地的local文件夹中
实现过程
在MainPage.xaml添加控件
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel>
<Image x:Name="MyImage" Source="/Assets/spider.jpg" Width="380" Height="520"></Image>
<Button Content="Pick The Image" Click="PickImage" HorizontalAlignment="Center" Margin="10"></Button>
</StackPanel>
</Grid>
在MainPage.xaml.cs中添加代码
namespace FileManagementSample
{
public sealed partial class MainPage : Page
{
private StorageFile file;
public MainPage()
{
this.InitializeComponent();
}
private async void PickImage(object sender, RoutedEventArgs e)
{
//选取图片
FileOpenPicker openPicker = new FileOpenPicker();
openPicker.FileTypeFilter.Add(".jpg");
StorageFile Pickfile = await openPicker.PickSingleFileAsync();
if (Pickfile != null)
{
//设置Image为选择的图片
BitmapImage bitmap = new BitmapImage();
using (var stream = await Pickfile.OpenAsync(Windows.Storage.FileAccessMode.Read))
{
bitmap.SetSource(stream);
}
MyImage.Source = bitmap;
//将图片保存在LocalFolder
StorageFolder localFolder = ApplicationData.Current.LocalFolder;
StorageFile fileCopy = await Pickfile.CopyAsync(localFolder, Pickfile.Name, NameCollisionOption.ReplaceExisting);
}
}
}
}
需要注意的地方:
- 通过ApplicationData.Current.LocalFolder获得LocalFolder
总结
整个项目其实是相当简单的,在将文件保存在LocalFolder后,我们就可以通过添加上面提到的前缀访问LocalFolder里的文件了,比如说我们代码中保存的图片,可以通过下面的代码访问:
//imagename替换为图片名,如博客的示例代码,imagename将为spider2.jpg
var uri = new System.Uri("ms-appdata:///local/" + imagename);
file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(uri);
BitmapImage bitmap = new BitmapImage();
using (var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
{
bitmap.SetSource(stream);
}
MyImage.Source = bitmap;
FYI
项目下载:FileManagementSample
项目下载之后记住把Debug模式从ARM换成X86或X64(根据你自己的机型选择),之前一开始学习的时候不知道这一点,从网上下载下来的项目都运行不了,纠结的一逼(╥╯^╰╥)