现代操作系统应用开发:UWP——文件管理(二):FileManagement

背景简介

我们的UWP程序想要读写本地的文件的时候,往往会遇到权限问题,这里存在着两个解决方法:

第一,电脑上的KnownFolder允许UWP程序直接访问;这里的KnowFolder指的是下面图片中的文件夹:

关于这种方法可以参考第一篇博客,本片博客将主要介绍第二中方法

第二,UWP程序启动时生成的local,temp,roaming(漫游)文件夹,程序对这三个文件夹也具有直接访问权限;当需要访问这些文件夹是,需要在添加ms-appdata:///前缀,如

文件夹前缀
localms-appdata:///local/
roamingms-appdata:///roaming/
tempms-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(根据你自己的机型选择),之前一开始学习的时候不知道这一点,从网上下载下来的项目都运行不了,纠结的一逼(╥╯^╰╥)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值