Windows Phone 8中的隔離式存儲機制分析
譯文【51CTO譯文】隔離式存儲機制的作用在于為Windows Phone系統實現本地數據存儲。之所以名為“隔離式”,是因為其它應用程序將無法訪問當前特定數據。在今天的文章中,我們將一同對隔離式存儲的概念加以了解,并學習如何才能利用它以更為安全的方式在Winodws Phone 8當中進行數據存儲。
隔離式存儲所采用的移動架構與Windows平臺上基于Silverlight的應用程序比較相似。全部I/O操作都被限定在隔離存儲范疇之內,而且無法直接訪問底層OS文件系統——這就預防了來自其它應用程序的未驗證訪問及數據損壞問題的發生,從而切實帶來安全性保障。如果大家希望在兩款應用程序之間進行數據共享,則需要某些支持數據共享功能的云服務作為中轉平臺。
Here are a few things worth mentioning about isolated storage:本地文件夾也就是我們移動設備當中應用程序數據存儲所使用的根文件夾。我們可以通過兩種方式實現本地數據存儲。***種是通過名為IsolatedStorageSettings的名/值對集合。第二種方式則是利用IsolatedStorageFile創建實際文件及文件夾。下面來看隔離式存儲機制當中需要高度關注的幾項重要內容:
- 隔離式存儲使用權限分配機制,即通過IsolatedStoragePermission對象設定存儲限制。
- 如果需要在分配機制之外進行數據寫入,則需要通過IsolatedStorageException添加例外。
- IsolatedStorageFilePermission負責決定是否為指定文件或者目錄提供權限。
1. URI方案
在處理路徑中的本地文件夾時,我們需要利用isostore或者ms-appdata URI方案名。這兩種URI方案名允許大家對本地文件夾進行訪問,但卻無法以互換方式使用。ms-appdata的作用在于通過API處理本地文件夾root,而isostore則負責處理本地文件夾root。以下示例能夠很好地展示二者的區別。
- // Create a local database in the local folder with the isostore URI scheme.
- MyDataContext db = new MyDataContext("isostore:/mydb.sdf");
- // Get a file from the local folder with the ms-appdata URI scheme.
- var file = await Windows.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/AppConfigSettings.xml"));
ms-appdata要求使用三個斜杠符號(///)而isostore則只需要使用一個斜杠符號(/)。兩種URI方案的路徑總長度都不能超過185個字符。
2. IsolatedStorageSettings
將數據添加到隔離式存儲中的最簡單方式在于利用IsolatedStorageSettings類,也就是通過Dictionary<TKey, TValue>格式將數據以鍵-值對的方式保存在隔離式存儲當中。IsolatedStorageSettings通常被用于保存設置信息,例如每頁顯示的圖片數量以及頁面布局選項等等。保存在IsolatedStorageSettings當中的數據會在應用程序啟動周期之內持續可用。
如果大家只是希望將設置信息保存為Username = "Fred"這種形式,那么也可以在隔離式存儲當中使用ApplicationSettings對象。其使用方式與處理目錄時完全相同。saveString方法則可被用于為鍵name保存一條字符串值message。
- void saveString(string message, string name)
- {
- IsolatedStorageSettings.ApplicationSettings[name] = message;
- IsolatedStorageSettings.ApplicationSettings.Save();
- }
這種存儲方式與目錄基本類似,但在完成鍵添加之后不要忘記調用Save進行保存。
為了從設置當中進行值檢索,大家可以使用loadString方法將已保存的設置鍵作為參數加以獲取、并在該鍵確實存在時返回與之對應的值。
- string loadString(string name)
- {
- if (IsolatedStorageSettings.ApplicationSettings.Contains(name))
- {
- return (string)IsolatedStorageSettings.ApplicationSettings[name];
- }
- else
- {
- return null;
- }
- }
在實際進行查找之前,請先行確認該鍵是否存在。如果大家嘗試從某個根本不存在的鍵中獲取與之對應的值,則會出現異常狀況。
***實踐方式之一在于創建一個特殊的靜態類,其中包含我們應用程序的全部設置信息。這種處理辦法能夠輕松保證我們隨時對應用程序中的任何組成部分進行訪問。
如果大家正在開發的是通用型Windows應用程序項目,那么使用IsolatedStorageSettings.ApplicationSettings將導致語法錯誤。大家需要將其替換為Windows.Storage.ApplicationData.Current.LocalSettings。
3. IsolatedStorageFile
大家可以利用IsolatedStorageFile機制將文件保存在用戶設備之上。我們能夠在隔離式存儲當中執行多種操作,例如創建文件夾以及文件、向文件中寫入內容、讀取數據以及移除文件等等。
這些文件與文件夾無法被同樣安裝在用戶設備上的其它應用程序所訪問。其中IsolatedStorageFileStream類負責實現隔離式存儲中文件的讀取、寫入與創建。該類對FileStream進行了拓展,這意味著大家可以在大多數FileStream實例能夠起效的場景下使用IsolatedStorageFileStream實例,例如構建StreamReader或者StreamWriter。
文件寫入
以下代碼片段所示為如何在隔離式存儲中實現文件寫入。saveGameToIsolatedStorage會在隔離式存儲當中創建一個新文件,并將message字符串保存于其中。
- private void saveGameToIsolatedStorage(string message)
- {
- using (IsolatedStorageFile isf =
- IsolatedStorageFile.GetUserStoreForApplication())
- {
- using (IsolatedStorageFileStream rawStream = isf.CreateFile("MyFile.store"))
- {
- StreamWriter writer = new StreamWriter(rawStream);
- writer.WriteLine(message); // save the message
- writer.Close();
- }
- }
- }
文件讀取
loadString函數負責讀取并返回包含在文件當中的文本內容。該函數利用FileExists首先檢查目標文件在隔離式存儲內是否存在,而后再利用StreamReader實例對文件進行讀取。
- private string loadString()
- {
- string result = null;
- using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
- {
- if (isf.FileExists("Myfile.store")
- {
- using (IsolatedStorageFileStream rawStream = isf.OpenFile(filename,
- System.IO.FileMode.Open))
- {
- StreamReader reader = new StreamReader(rawStream);
- result = reader.ReadLine();
- reader.Close();
- }
- }
- }
- return result;
- }
隔離式存儲機制不可用于Windows Store應用程序。相反,這部分應用程序數據類可以用于包含在Windows Runtine API中的Windows.Storage命名空間,從而實現本地數據與文件的保存。
建議大家在不再需要時,將IsolatedStorageFile與IsolatedStorageFileStream實例及時處理掉。using語句能夠自動完成上述任務,因此大家應當將其作為***實踐廣泛使用。
外部文件寫入
為了覆蓋外部文件的現有內容,大家可以首先使用StreamWriter類將對應文件打開。其中的FileMode.Open與FileAccess.Write參數專門負責打開目標文件并執行寫入訪問。這樣我們就能利用新數據將文件中的原有內容加以覆蓋。
- IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication();
- if (myIsolatedStorage.FileExists(filename))
- {
- using (StreamWriter writeFile = new StreamWriter(new IsolatedStorageFileStream(filename, FileMode.Open, FileAccess.Write, myIsolatedStorage)))
- {
- string someTextData = "Learn to code using Tuts+";
- writeFile.WriteLine(someTextData);
- writeFile.Close();
- }
- }
向現有文件中添加內容
向現有文件中添加數據與向現有文件中寫入數據非常相似。惟一的區別在于,我們需要在FileMode.Append當中設定文件模式。
- IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication();
- if (myIsolatedStorage.FileExists(filename))
- {
- if (myIsolatedStorage.FileExists(filename))
- {
- using (StreamWriter writeFile = new StreamWriter(new IsolatedStorageFileStream(filename, FileMode.Append, FileAccess.Write, myIsolatedStorage)))
- {
- string someTextData = "Use Tuts+ to Learn Creative Skills, Shape Your Future";
- writeFile.WriteLine(someTextData);
- writeFile.Close();
- }
- }
- }
文本文件刪除
要刪除一個文本文件,我們首先需要檢查該文本文件是否存在于隔離式存儲當中,而后利用DeleteFile實現文件刪除。
- IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication();
- if (myIsolatedStorage.FileExists(filename))
- {
- myIsolatedStorage.DeleteFile(filename);
- }
在這里,建議大家點擊此處查看更多示例應用程序,從而進一步了解如何在文件中讀取、寫入并添加其它數據。
4. 隔離式存儲資源管理器
在對應用程序進行調試的過程中,大家可能需要對應用程序的隔離式存儲當中對已經保存的文件及文件夾進行保存,從而驗證正確的文件是否被保存在正確的位置。運行有Windows Phone 8或者更低版本的模擬器及設備可以使用Windows Phone Power Tools,這款基于GUI的臣僚能夠對各應用程序的隔離式存儲內容進行訪問。
另一種選擇則是使用隔離式存儲資源管理器(Isolated Storage Explorer)或者簡稱ISETool,這款命令行工具隨同Windows Phone SDK一同安裝。大家可以利用ISETool對應用程序本地文件夾內的文件及目錄進行羅列、復制以及替換。
ISETool適用于任何類型的設備或者模擬器,而且通常被安裝在以下位置:
Program Files(x86)\MicrosoftSDKs\WindowsPhone\v8.0\Tools\IsolatedStorageExplorerTool
下面來看使用ISETool時需要注意的幾點重要事項:
- 應用程序必須被安裝在模擬器或者設備當中。
- 該模擬器或者設備必須已經解鎖,但應用程序并非必須處于運行狀態。
- 大家無法通過Windows Phone Store對已安裝應用程序的隔離式存儲進行訪問。
- 大家無法利用ISETool通過IsolatedStorageSettings類查看所保存的設置信息。
要使用ISETool,大家需要使用以下語法:
1 |
ISETool.exe <cmd[:param]> <target-device[:param]> <product-id> [<desktop-path>] |
下面再來看其它可以通過ISETool實現的操作。
從隔離式存儲中將文件復制到計算機當中
- 將大家需要測試的應用程序部署到模擬器或者設備當中,而后創建本地文件及目錄。
- 從WMAppManifest.xml文件當中應用元素的ProductID屬性處獲取應用ID。
- 利用命令提示符前往ISETool.exe,而后運行以下命令將應用程序隔離式存儲內的全部文件復制到計算機當中。
1 |
ISETool.exe ts xd f8ce6878-0aeb-497f-bcf4-65be961d4bba c:\data\myfiles |
在隔離式存儲中進行文件替換
重復以上三個步驟,而后利用以下命令對應用程序隔離式存儲中的文件進行替換。
1 |
ISETool.exe rs xd f8ce6878-0aeb-497f-bcf4-65be961d4bba “C:\Data\My Files” |
如果大家希望了解更多與ISETool相關的信息,不妨點擊此處查看我專門就ISETool使用撰寫的另一篇文章。
總結
我們在Windows Phone當中擁有兩種簡單機制可供選擇,分別為IsolatedStorageSettings與IsolatedStorageFile。隔離式存儲是一套存儲區,其中所包含的文件與目錄無法被其它應用程序所訪問。隔離式存儲在多種場景下都能發揮重要作用,也歡迎大家點擊此處下載本教程相關源文件作為參考。
原文鏈接:Working With Isolated Storage on Windows Phone 8
核子可樂譯