什么是独立存储
独立存储(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