欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

WP7的独立存储--kk小结

程序员文章站 2022-04-12 08:39:58
wp7--独立存储: 1> 什么是独立存储?      任何安装在windows phone 7中的程序都可以访问自身的永久磁盘存储区域,该区域称为独...


wp7--独立存储:
1> 什么是独立存储?
     任何安装在windows phone 7中的程序都可以访问自身的永久磁盘存储区域,该区域称为独立存储。此种存储方式将提供一个磁盘存储空间,他是一种虚拟的文件,能存储小量的数据;在默认的情况下,它只能存储1mb的文件;用户可能根据自己的要求可以对空间的大小进行合理的分配。其数据本身还是存储在本地文件系统中的,但是其实际对于应用程序是透明的,应用程序只能够访问当前用户在当前应用程序域的文件及文件夹。
     如下图所示,每个应用程序将在独立存储中被分配一个独立的存储空间,称为应用程序数据存储文件夹,即该应用的独立存储根目录。应用程序可以调用独立存储api在该目录下存储数据,根据使用方式及功能的不同,独立存储空间又包含两部分(独立设置存储和独立文件存储)。

 WP7的独立存储--kk小结
<——  应用程序独立存储空间逻辑结构 (此图源自msdn)

2> 设置和文件
     wp7没有本地api可以利用,提供的有xml、独立存储和云存储。isolated storage(独立存储)有两种方式在本地存储你的数据,第一是通过库中的键/值对,叫做isolatedstoragesettings(独立设置存储),第二是通过创建真实的文件和目录,叫做isolatedstoragefile(独立文件存储)。
  2.1>  isolatedstoragesettings(独立设置存储)
        isolatedstoragesettings是支持保存应用程序存储区或网站存储中的键/值对的字典集合,它自动负责序列化对象,并将其保存在独立存储中。(已序列化的对象将保存到名为_localsettings的独立存储中的文件中。)它以键/值对方式提供一种快速数据访问方式,主要用于存储一些应用设置信息。对外表现为一个键值对集合,可以使用兼职对集合的语法来进行操作。     
       命名空间为:system.io.isolatedstorage;主要涉及system.io.isolatedstorage.isolatedstoragesettings类。
  2.1.1>   
        //创建操作独立设置存储必须的isolatedstoragesettings类的对象
             isolatedstoragesettings settings = isolatedstoragesettings.applicationsettings;
        //添加一个键值对
             settings.add(key,value);   
              或 根据key来获取相对应的value
             settings[key]=value;
              if(settings.contains(key))
               {
                   string value = settings[key].tostring();
               }
        //读取键值对
             string kk = (string)settings["kk"];
        //修改键值对
             settings["kk"] = value;
        //判断该键是否存在
             string isexist = settings.contains("kk");
        //移除
             settings.remove("kk");
        //清除
             settings.clear();
        //保存
             settings.save();
2.1.2>  以下用一个例子来说明:(源自wp7完美开发征程)     wp7主界面如下图 app1 所示:
  view code
 1 using system;
 2 using system.collections.generic;
 3 using system.linq;
 4 using system.net;
 5 using system.windows;
 6 using system.windows.controls;
 7 using system.windows.documents;
 8 using system.windows.input;
 9 using system.windows.media;
10 using system.windows.media.animation;
11 using system.windows.shapes;
12 using microsoft.phone.controls;
13
14 using system.io.isolatedstorage;
15 namespace isolatedstoragesettings
16 {
17     public partial class mainpage : phoneapplicationpage
18     {
19         //创建操作独立设置存储必须的isolatedstoragesettings类的对象
20         isolatedstoragesettings settings = isolatedstoragesettings.applicationsettings;
21         // 构造函数
22         public mainpage()
23         {
24             initializecomponent();
25         }
26         //为4个按钮添加changesettins事件处理程序
27         private void changesettings(object sender, routedevent e)
28         {
29             string key = txbkey.text.trim();
30             string value = txbvalue.text;
31          
32             //表示按钮控件
33           button clickedbutton = sender as button;
34            
35             switch (clickedbutton.name)
36             {
37                 //添加
38                 case "btn_add": settings.add(key, value); break;
39                 //修改
40                 case "btn_update": settings[key] = value; break;
41                 //移除指定键值对
42                 case "btn_remove": settings.remove(key); break;
43                 //清除
44                 case "btn_clear": settings.clear(); break;
45             }
46
47             //保存
48             settings.save();
49            
50             readallsettings();
51         }
52         //显示所有的键值对
53         protected void readallsettings()
54     {
55        string message = "all setting key-values:"+system.environment.newline;
56         foreach(string key in settings.keys)
57         {
58         message += string.format("{0}={1}\n",key,settings[key].tostring());
59         }
60       teblocksettings.text = message;
61     }
62    
63 }
 

   
WP7的独立存储--kk小结   <—— 图app1          WP7的独立存储--kk小结      < —— 图app2                      
2.2>  isolatedstoragefile(独立文件存储)
         isolatedstoragefile提供类似于文件系统一样的访问方式,应用程序可以以文件形式在其中存储任意数据(包括文本、图像、音视频,甚至代码文件等),如同操作常规文件系统一样创建、删除、访问文件及文件夹。
       命名空间为:system.io.isolatedstorage;主要涉及system.io.isolatedstorage.isolatedstoragefile类。实际上,isolatedstorage.isolatedstoragefile类是filestream类的一个子类。       
  2.2.1>   isolatedstoragefile 常用的方法如下:
            方法名                           说明
         createdirectory()        创建一个新的独立存储文件夹
         deletedirectory()        删除独立存储文件夹       
         createfile()                创建文件
         deletefile()                删除文件                  
         getfilenames()           得到文件名称集合
         getdirectoryname()    得到文件夹名称集合
         openfile()                  打开文件
         remove()                  移出所有的文件和文件夹 
   2.2.2> 文件读写操作的基本过程如下:
        (1)用获得的isolatedstoragefile对象的openfile方法创建一个isolatedstoragefilestream对象(或者用isolatedstoragefilestream的构造方法构造)。
        (2)针对isolatedstoragefilestream对象构造streamreader或streamwriter对象进行文件读写。
        (3)不要忘记关闭流对鞋对象以释放资源。
 
 

 示例代码1:
  view code
 1          //为程序获取一个虚拟的本地存储 
 2            isolatedstoragefile mystorage = isolatedstoragefile.getuserstoreforapplication(); 
 3          //创建一个新的文件夹,并创建一个newtext.txt文档
 4            mystorage.createdirectory("textfiles"); 
 5            isolatedstoragefilestream isolatedfilestream = 
 6            new isolatedstoragefilestream("textfiles//newtext.txt", filemode.openorcreate, filestorage);   
 7          //写入数据
 8            streamwriter filewriter = new streamwriter(isolatedfilestream);  
 9            filewriter.writeline(newtext.txt); 
10          //关闭streamwriter. 
11            filewriter.close(); 
12          //读取数据
13            streamreader filereader=new streamreader(isolatedfilestream); 
14            string str=filereader.readline(); 
15            filereader.close(); 
16          //判断存储区某文件是否存在,参数是文件路径 
17            filestorage.fileexists("file path");

      也可将以上的创建和读取代码放入using语句中,更改为下面的代码
      示例代码2:
  view code
 1     // 创建一个新的文件夹,并创建一个newtext.txt文档
 2      mystorage.createdirectory("textfiles");  
 3     using (var isolatedfilestream = new isolatedstoragefilestream("textfiles//newtext.txt", filemode.openorcreate, mystore))
 4     {
 5       //写入数据
 6         using (var filewriter = new streamwriter(isolatedfilestream))
 7         {
 8             filewriter.writeline(newtext.txt);
 9         }
10     }
11
12     //将文字读出来,放入try..catch语句中处理异常
13
14     isolatedstoragefile mystorage = isolatedstoragefile.getuserstoreforapplication();
15   try
16     {
17        // 指出具体路径
18         using (var isolatedfilestream = new isolatedstoragefilestream(textfiles//myfile.txt", filemode.open, mystore))
19         {
20             // 读取数据
21            using (var filereader = new streamreader(isolatedfilestream))
22             {
23                 txtread.text = filereader.readline();
24             }
25         }
26      }
27     catch
28     {
29         //当用户第一次点击read按钮时处理异常
30         txtread.text = "需要第一次创建文件";
31     }

2.2.3>  以下用一个例子来展示独立存储中基本的文件读写操作。(源自wp7完美开发征程) wp7主界面如上图 app2 所示:
  view code
 1 using system;
 2 using system.collections.generic;
 3 using system.linq;
 4 using system.net;
 5 using system.windows;
 6 using system.windows.controls;
 7 using system.windows.documents;
 8 using system.windows.input;
 9 using system.windows.media;
10 using system.windows.media.animation;
11 using system.windows.shapes;
12 using microsoft.phone.controls;
13
14 using system.io.isolatedstorage;
15 using system.io;
16 namespace phoneapp19
17 {
18     public partial class mainpage : phoneapplicationpage
19     {
20         //为程序获取一个虚拟的本地存储
21         isolatedstoragefile storagefile = isolatedstoragefile.getuserstoreforapplication();
22         // 构造函数
23         public mainpage()
24         {
25             initializecomponent();
26         }
27         //写入数据
28         private void btnwrite_click(object sender, routedeventargs e)
29         {
30             string filepath = txbfilepath.text.trim();
31             string filename = txbfilename.text.trim();
32             string fullfilename = system.io.path.combine(filepath,filename);
33             string content = txbcontent.text;
34             //判断文件是否存在,若不存在则创建
35             if (!storagefile.directoryexists(filepath))
36             {
37                 storagefile.createdirectory(filepath);
38             }
39             //写入
40             using (streamwriter writer = new streamwriter(storagefile.openfile(fullfilename, filemode.append)))
41             {
42                 writer.writeline(content);
43             }
44         }
45         //读取数据
46         private void btnread_click(object sender, routedeventargs e)
47         {
48             string fullfilepath = txbfullfilepath.text.trim();
49           
50             if (!storagefile.fileexists(fullfilepath))
51             {
52                 txbreadcontent.text = "指定文件不存在";
53                 return;
54             }
55             //读取
56             using (streamreader reader = new streamreader(storagefile.openfile(fullfilepath, filemode.open)))
57             {
58                 txbreadcontent.text = reader.readtoend();
59             }
60         }
61       
62     }
63 }

kk--附:
    创建命名空间时的一个快捷方式:
    当清楚属性 isolatedstoragesettings 时,写出属性 isolatedstoragesettings ,并输入,按住ctrl键同时输入.即打开一个小helper窗口,在窗口中的那个小using语句高亮显示时,单机键盘上的return或enter键,便在页面开头部分添加了一个新的using语句,即 using system.io.isolatestorage 。

kk--小感:
    这是我第一次在博客园上发表文章,文章写的有点死板,不是很成熟,可能也有些知识点没有涉及到,希望读者能给我意见或建议吧。万事开头难,我会努力的,fighting!

 
摘自  kefira