1. 程式人生 > >現代作業系統應用開發:UWP——檔案管理(二):FileManagement

現代作業系統應用開發:UWP——檔案管理(二):FileManagement

背景簡介

我們的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

專案下載之後記住把Debug模式從ARM換成X86或X64(根據你自己的機型選擇),之前一開始學習的時候不知道這一點,從網上下載下來的專案都執行不了,糾結的一逼(╥╯^╰╥)