標籤:style c class blog code java
Windows Phone 8.1 應用的資料存放區位置包括:
- Installation Folder
- ApplicationData
- Credential Locker
- Known Folders
- SD Card
- File System
- Networks
附張圖:
(1)Installation Folder
Installation Folder 也就是開發人員在項目裡自己添加的檔案,只能進行讀操作。
比如項目結構為:
要使用 Images 檔案夾裡的圖片,則可以在 XAML 中這樣寫:
<Image x:Name="image" Source="/Images/螢幕(157).png" Stretch="Uniform"/>
若要在 C# 代碼中使用,則要在檔案路徑前加 ms-appx:///
protected override void OnNavigatedTo(NavigationEventArgs e){ BitmapImage img = new BitmapImage(new Uri("ms-appx:///Images/螢幕(157).png")); image.Source = img;}
注意:檔案的產生操作為內容
(2)ApplicationData
ApplicationData 也就是應用的隔離儲存區 (Isolated Storage),可自由進行讀寫操作,分為以下三個地區:
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 的資料操作將在其它隨筆中說明。