Windows Phone 8.1 應用的數據存儲位置包括:html
附張圖:數組
(1)Installation Folderapp
Installation Folder 也就是開發者在項目裏本身添加的文件,只能進行讀操做。ide
好比項目結構爲:this
要使用 Images 文件夾裏的圖片,則能夠在 XAML 中這樣寫:spa
<Image x:Name="image" Source="/Images/屏幕截圖(157).png" Stretch="Uniform"/>
若要在 C# 代碼中使用,則要在文件路徑前加 ms-appx:///code
protected override void OnNavigatedTo(NavigationEventArgs e) { BitmapImage img = new BitmapImage(new Uri("ms-appx:///Images/屏幕截圖(157).png")); image.Source = img; }
注意:文件的生成操做爲內容orm
(2)ApplicationData視頻
ApplicationData 也就是應用的獨立存儲,可自由進行讀寫操做,分爲如下三個區域:htm
1)Local(Folder,Settings)
保存在手機端,沒有存儲限制,更新應用時會保留,包括 Folder 和 Settings。
使用方法很是簡單:
StorageFolder folder = ApplicationData.Current.LocalFolder;
ApplicationDataContainer settings = ApplicationData.Current.LocalSettings;
Folder 的操做也很是簡單,固然也能夠經過 Stream 來操做,以下:
StorageFolder folder = ApplicationData.Current.LocalFolder; await folder.CreateFileAsync("some.txt"); await folder.CreateFolderAsync("some"); await folder.GetFileAsync("some.txt"); await folder.GetFolderAsync("some"); await folder.OpenStreamForReadAsync("some.txt"); await folder.OpenStreamForWriteAsync("some.txt", CreationCollisionOption.FailIfExists);
而 Settings 是一個鍵值對數組,用以保存簡單數據,類型爲 <string, Object>,所以在讀取數據時要對值進行拆箱:
ApplicationDataContainer settings = ApplicationData.Current.LocalSettings; settings.Values["some"] = "some"; if( settings.Values.ContainsKey("some") ) { string some = (string)settings.Values["some"]; }
2)Roaming(Folder,Settings)
保存在雲端 OneDrive 處,能夠跨設備使用,可是有 100Kb 的限制,也包括 Folder 和 Settings。
Roaming 數據的操做與 Local 的操做一致,須要注意的是那 100kb 的限制,以及當漫遊數據發生改變時會觸發的事件 DataChanged,好比能夠在該事件中更新本地數據:
public MainPage() { this.InitializeComponent(); ApplicationData.Current.DataChanged += Current_DataChanged; } private void Current_DataChanged(ApplicationData sender, object args) { if( localSettings.Values.ContainsKey("test") && roamingSettings.Values.ContainsKey("test") ) { localSettings.Values["test"] = roamingSettings.Values["test"]; } }
注意:應用必須獲取了應用商店的認證才能使用數據漫遊。
3)Temp(Folder)
保存在手機端的臨時數據,不能保證什麼時候被刪除(如手機存儲空間不足時則自動刪除),只有 Folder。
使用方法與 Local 和 Roaming 一致,不一樣的事它是能使用 Folder。
除了以上的訪問 ApplicationData 的方法外,一樣的可使用 Uri 的方式訪問上述各 Folder,只需在路徑前添加 ms-appdata:///:
var localFile = StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/some.txt")); var roamingFile = StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///roaming/some.txt")); var tempFile = StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///temp/some.txt"));
(3)Credential Locker
Credential Locak 是一個用來保存用戶帳號與密碼對的一個私密空間,不會被其它應用訪問,同時還支持同應用的跨設備漫遊。
使用方法:
private void saveButton_Click(object sender, RoutedEventArgs e) { string username = idTextBox.Text.Trim(); string password = passwordBox.Password.Trim(); PasswordCredential cred = new PasswordCredential("weibo", username, password); PasswordVault value = new PasswordVault(); value.Add(cred); } private void loadButton_Click(object sender, RoutedEventArgs e) { PasswordVault value = new PasswordVault(); var creds = value.FindAllByResource("weibo"); if( creds.Count != 0 ) { foreach( var cred in creds ) { cred.RetrievePassword(); messageTextBlock.Text += string.Format("{0}\n{1}\n{2}\n", cred.Resource, cred.UserName, cred.Password); } } }
注意:在獲取密碼的時候必須先調用 RetrievePassword 方法,否則獲取的密碼爲空字符串。
(4)Known Folders
Known Folders 也就是手機上特有的幾個文件夾,好比音樂視頻文件等。
獲取方法爲:
StorageFolder DocumentsLibrary = KnownFolders.DocumentsLibrary; StorageFolder MusicLibrary = KnownFolders.MusicLibrary; StorageFolder VideosLibrary = KnownFolders.VideosLibrary; StorageFolder PicturesLibrary = KnownFolders.PicturesLibrary; StorageFolder CameraRoll = KnownFolders.CameraRoll; StorageFolder SavedPictures = KnownFolders.SavedPictures; StorageFolder RemovableDevices = KnownFolders.RemovableDevices; StorageFolder HomeGroup = KnownFolders.HomeGroup; StorageFolder MediaServerDevices = KnownFolders.MediaServerDevices;
以上是可獲取的全部 Known Folders,其中 HomeGroup 和 MediaServerDevices 文件夾暫時還未開放。
注意:某些文件夾的讀取須要在 appxmanifest 獲取權限:
(5)SD Card
SD Card 的文件讀取一樣須要在 appxmanifest 獲取權限。
獲取方法爲:
var devices = KnownFolders.RemovableDevices; var sdCards = await devices.GetFoldersAsync(); if( sdCards.Count == 0 ) return; StorageFolder firstCard = sdCards[0];
要注意的是,對 SD Card 的文件讀取須要事先在 appxmanifest 中增長文件類型關聯,肯定須要讀取的文件類型:
(6)備註
關於使用 FilePicker API 與 FileSystem 的操做,以及 Networks 的數據操做將在其它隨筆中說明。