Windos phone7的Isolated storage使用示例
在windows phone7上, Isolated storage相当于一个程序的独立存储区,只能供本程序使用,而不允许别的程序访问。
从开发上来说,以前的windows mobile程序安装后,在手机的资源管理器里能看到程序安装目录下的所有文件,包括你自己的一些资源文件,资源图像等等,就像PC上一样,但是在phone7上,没有办法可以看到这些文件,因为这些文件在工程Build的时候以Content或Resource的格式包括到了一个后缀名为.XAP的文件里了,你可以用解压软件打开这个XAP可以看到它实际上也是一个压缩包而已,但是这个包里的文件在程序运行时只能被程序读,而不允许修改。例如我们可以用System.Windows.Application.GetResourceStream()来读取一个文件到一个Stream,
但是我们不能反过来更改这个文件。
那么如果我们需要在程序运行期间修改某个文件,比如往某个文本文件里增加一些文字或者删除一些内容,要怎么办呢?
解决办法是: 我们需要在程序第一次在手机上运行的时候把这些文件复制到Isolated storage里,以后程序每次使用的时都从storage里读或写,原来打包的XAP里文件就可以不用去管它了。
实际上这种使用方法还有另外一个好处,那就是当你的程序具有版本升级功能时,当新版本下载完成后,要先卸载旧版软件,在卸载时会删除程序所有文件,但不会影响到Isolated storage里的文件,因此新版本安装后,你的Isolated storage里还存有你原来的文件而不会被覆盖掉。
下面我用代码演示一些Isolated storage的常见用法:
1. 下面的示例演示了如何向Isolated storage里写一个文本文件,然后再读出来
02 using System.IO.IsolatedStorage;
03 using System.Windows;
04 using Microsoft.Phone.Controls;
05
06 namespace WP7IsoStorageDemo
07 {
08 public partial class MainPage : PhoneApplicationPage
09 {
10 // Constructor
11 public MainPage()
12 {
13 InitializeComponent();
14 }
15
16 private void btnSave_Click(object sender, RoutedEventArgs e)
17 {
18 string fileName = "MyTextfile.txt";
19
20 using (var isoStorage = IsolatedStorageFile.GetUserStoreForApplication())
21 {
22 // we need to check to see if the file exists
23 if (!isoStorage.FileExists(fileName))
24 {
25 // file doesn't exist...time to create it.
26 isoStorage.CreateFile(fileName);
27 }
28
29 // since we are appending to the file, we must use FileMode.Append
30 using (var isoStream = new IsolatedStorageFileStream(fileName, FileMode.Append, isoStorage))
31 {
32 // opens the file and writes to it.
33 using (var fileStream = new StreamWriter(isoStream))
34 {
35 fileStream.WriteLine(txtText.Text);
36 }
37 }
38
39 // you cannot read from a stream that you opened in FileMode.Append. Therefore, we need
40 // to close the IsolatedStorageFileStream then open it again in a different FileMode. Since we
41 // we are simply reading the file, we use FileMode.Open
42 using (var isoStream = new IsolatedStorageFileStream(fileName, FileMode.Open, isoStorage))
43 {
44 // opens the file and reads it.
45 using (var fileStream = new StreamReader(isoStream))
46 {
47 txtCurrentText.Text = fileStream.ReadToEnd();
48 }
49 }
50 }
51 }
52 }
53 }
2. 下面演示:如何从你的工程里复制文件到Isolated storage, 这里要复制的文件是二进制格式的,因此代码中使用的是BinaryWriter 和 BinaryReader。
由于是用二进制读写,因此任何文件都可以操作,例如你可以拷贝.jpg文件到Isolated storage里,只要在创建文件时时候合适的文件后缀名即可。
string PersonDBFile = "Resources\\person.db"; //Resources目录是工程里的一个子目录
using (var isoStorage = IsolatedStorageFile.GetUserStoreForApplication())
{
#region If PersonDB file is not exists in IsolatedStorage, copy it from XAP resources
if (!isoStorage.FileExists(PersonDBFile))
{
using (var isoStream = new IsolatedStorageFileStream(PersonDBFile, FileMode.Create, isoStorage))
{
using (var writer = new BinaryWriter(isoStream))
{
string PersonDBFileXap = string.Format(CultureInfo.InvariantCulture, PersonDBFile);
StreamResourceInfo sri = Application.GetResourceStream(new Uri("Resources/" + PersonDBFileXap, UriKind.Relative));
using (BinaryReader reader = new BinaryReader(sri.Stream))
{
long len = sri.Stream.Length;
for(long i = 0; i<len; i++)
writer.Write(reader.ReadByte());
}
}
}
}
}
3.下面演示如何从Isolated storage里删除文件和目录
{
using (var isoStorage = IsolatedStorageFile.GetUserStoreForApplication())
{
string[] filesInSubDir = isoStorage.GetFileNames(RefPhotosDir + "\\" + "*.*"); //列出指定目录下所有文件
if (isoStorage.FileExists(PersonDBFile)) //判断文件是否存在
{
isoStorage.DeleteFile(PersonDBFile); //删除文件
}
if (isoStorage.FileExists(MetadataFile))
{
isoStorage.DeleteFile(MetadataFile);
}
for (int i = 0; i < filesInSubDir.Length; i++)
{
isoStorage.DeleteFile(RefPhotosDir + "\\" + filesInSubDir[i]);
}
isoStorage.DeleteDirectory(RefPhotosDirName); //删除目录
}
}