Windows Phone 之獨立存儲

 

什麼是獨立存儲
獨立存儲(isolatedstorage)這個東西 是首先在SilverLight使用的(好吧我是因爲wp才認識獨立存儲的)
要說明什麼是獨立存儲 首先就說什麼是獨立(isolated) 獨立就是自個爲一體
獨立存儲就是 A程序存的東西只能A用 B不能用 相同道理B的東西只能B自己用A不能訪問
這樣做的很大好處是能提升安全性 哪怕你自個下載個病毒那病毒也只能在自個的獨立存儲空間內才能形成破壞
由於wp的獨立存儲其實是“共享存儲”(大家的獨立存儲空間其實都是共享手機的那塊內存 所謂獨立只是邏輯上的文件形式獨立而不是空間的獨立)
所以wp手機就算中毒最壞的情況也只是手機空間被撐暴而已(自個理解 歡迎拍磚)
 
獨立存儲分2種形式:
1.文件形式的存儲,通過真實的文件和目錄的形式來創建和管理數據
2.設置的形式,通過字典的方式創建鍵值對,可用於保存少量的數據(對於實現墓碑機制和諸如軟件的設置一類的話這貨挺有用的)
 
首先說明下獨立存儲(IsolatedStorage)是位於System.IO.IsolatedStorage
當輸入IsoLatedStorage的時候智能提示會有4個跟獨立存儲有關的。。。這個應該叫選項還是選擇呢?
 

其中第一個IsolatedStorageException是獨立存儲的異常錯誤
第二個就是用來創建和管理文件的
第三個則主要是用於讀取,將獨立存儲裏存儲的文件已流的形式讀取出來(此類繼承自FileStream,大部分情況下適用與FileStream的都可以兼容這貨)
第四個則是以設置的形式獲得獨立存儲區。。(就像剛纔說的獨立存儲的2種形式的第二種)
 
異常沒什麼好說的 重點說第二跟第四個 也就是IsolatedStorageFile 和 IsolatedStorageSettings
 
IsolatedStorageFile
先說如何在獨立存儲裏創建一個名叫 hello.txt且裏面寫着hello的文本文檔。。
要在獨立存儲區裏新建一個文件 首先要先獲得該軟件(一說用戶)所擁有的獨立存儲區
var appStorage = IsolatedStorageFile.GetUserStoreForApplication();
(。。。第一次寫帶代碼的博客 不會高亮顯示關鍵字。。。如何弄呢? HTML代碼看着蛋疼啊。。。)
 
然後創建該文件
var fileName = appStorage.OpenFile(“hello.txt”,FileMode.OpenOrCreate)
對於這句代碼可能會有疑問,不是說好的創建嗎? 怎麼是OpenFIle的?而且appStorage裏也有個CreateFile的方法啊

說到這個請注意代碼的後半段,FileMode.OpenOrCreate  雖說我是用了OpenFile這個沒錯,不過有FileMode在。。。
OpenOrCreate意味着如果文件當前存在,則讀取文件,假如不存在,就新建一個,不過這是在你可能擁有文件的前提下才用OpenFile會比較科學,如果死都要創建新文件的話
如果直接用CreateFIle的話,假如當前獨立存儲區已經有了該文件會報Exception的
科學的做法是要先確定文件是否存在,如果存在則刪除在創建(懶了。。直接貼我自己寫的代碼的圖吧)
 
好了 現在已經有了那個文件了 如何向裏面寫入數據呢 這個的話個正常的其他c#的io操作差不多,直接用StreamWriter就ok了
 
StreamWriter sw = new StreamWriter(fileName);
sw.WriteLine("hello");
 
自此就已經完成任務啦,在獨立存儲區裏創建了一個叫 hello.txt的文件且裏面寫有hello
另外稍微注意的是獨立存儲是屬於非託管資源 所以其需要手動釋放(想問爲什麼??跟Stream爲什麼需要手動釋放同道理,非託管的不被CLR管理)
典型的辦法最好是新建獨立存儲的時候用一個using語句圍起來 這樣可以避免忘記Dispose
另外可能有人問 我存進去了那怎麼讀出來呢?基本步驟差不多(我都用了OpenFile了,其實就是爲了方便,讀寫一體化)
然後StreamWriter換成StreamReader讀出裏面的流即可
 
 
IsolaterStorageSettings
這個東西會在獨立存儲區內以字典的形式保存數據
感覺好像是存在一個叫 __ApplicationSettings 的文件裏(不知道正確與否 但是用上了Settings的話好像就鐵定會多出這個文件)
也通過例子來說話
這次的目標是在獨立存儲區保存一個鍵爲"hello”值爲"everyone”
 
首先也要跟File那個差不多獲取當前軟件內所擁有的獨立存儲區 不過這次獲得的是Settings而不是File了(畢竟我們是要保存到Settings而不是以真實文件形式保存)
 
IsolatedStorageSettings setting = IsolatedStorageSettings.ApplicationSettings;
獲取之後其實就可以很簡單的
setting[“鍵的名稱"]=值
但是這樣子明眼人一看就知道不科學
 
作爲一個崇尚科學的人 在賦值前肯定要先確定他當前是否存在
如果當前存在該鍵的話是用新的值覆蓋掉原來的還是保持原樣這個就看各位的處理
如果不存在的話在用add方法添加該鍵
if(setting.Contains("hello"))
{
//這裏如何處理就看各位了 覆蓋還是忽略?
}
else
{
    setting.Add("hello","everyone");
}
 
這樣子就“科學的”存放好了該鍵值對了 然後如何讀取呢?
繼續科學的說 要科學的獲取值 肯定也要像剛纔那樣科學的判斷該鍵是否存在 如果存在則獲取 不存在的話。。這個我一般會用一個默認值來代替
if (setting.Contains("hello"))
 {
    value = (string)setting["hello"];
}
 else
 {
     value = defaultValue;
}
需要注意的是通過setting["hello"]獲取到的是一個object類型的值,所以需要強制轉換下
 
之前看微軟有一個4天快速wp入門的
裏面那人還用Cotains判斷後在用TryGetValue來獲取。。這個覺得就有點兒太謹慎了吧?(既然都包含這鍵了肯定就有這個值了 null也算是一個值吧?至少就不會Exception了
 
關於獨立存儲的就說這麼多先把。。。。End
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章