现在的位置: 首页 > 综合 > 正文

Silverlight之文件操作

2014年02月25日 ⁄ 综合 ⁄ 共 5035字 ⁄ 字号 评论关闭

大家都知道在Silverlight中无法直接使用System.IO进行操作文件,当然这个是为了安全考虑,不过Silverlight提供了其他的操作方法,原理近似,同样很简单。 提到Silverlight中的文件操作,第一个肯定是独立存储Isolated Store,这个东东相当于于一个本地的小型存储空间,通过它可以把一些不重要的数据(用户的一些配置信息或
  

  大家都知道在Silverlight中无法直接使用System.IO进行操作文件,当然这个是为了安全考虑,不过Silverlight提供了其他的操作方法,原理近似,同样很简单。

  提到Silverlight中的文件操作,第一个肯定是独立存储Isolated Store,这个东东相当于于一个本地的小型存储空间,通过它可以把一些不重要的数据(用户的一些配置信息或者文件)

  IsolatedStorageFile:

  保存在客户端,由于这个空间是可以在本地查看得到,同时用户也可以随意的删除这些文件件以及文件,所以不要存放重要的信息。

  IsolatedStorageFile.GetUserStoreForApplication();得到基于当前用户和当前应用程序的IsolatedStorageFile。

  IsolatedStorageFile.GetUserStoreForSite();得到基于当前website域的所有IsolatedStorageFile(不止一个Application的,可能同一个website下有多个xap文件,那么这些是共享的),这样就可以在多个Application中共享信息。

  下面先看下独立存储的规则:

  1.不同的XAP文件,在同一个website下并且在同一个文件夹有不同的独立存储文件

  2.如果Application在不同的site宿主,则有自己的独立存储文件

  3.如果使用不同的TestPage,使用同一个XAP,则使用同一个独立存储文件

  4.如果重命名XAP文件,则使用不同的独立存储文件

  5.如果修改版本信息,等其他的程序及配置信息,则还使用同一个独立存储文件

  6.如果替换一个名字一样的XAP文件,则还使用之前的独立存储文件

  IsolatedStorageFile操作文件的方法:

  CreateDirectory() 创建一个文件夹在Isolated Store,根据用户指定的名字。

  DeleteDirectory() 删除一个文件夹,根据用户指定的名字。

  CreateFile() 创建一个文件,根据用户指定的名字,并且返回IsolatedStorageFileStream对象,可以用来进行写入操作。

  DeleteFile() 删除一个文件,根据指定的名字。

  Remove() 移除Isolated Store对象,包含所有的文件夹和文件。

  OpenFile() 打开一个文件,并且返回IsolatedStorageFileStream对象。

  FileExists() 判断一个文件是否存在,返回true或者false。

  DirectoryExists() 判断一个文件夹是否存在,返回true或者false。

  GetFileNames() 获得根目录(指定的目录)下的所有文件名称,返回一个string的array。

  GetDirectoryNames() 获得根目录(指定目录下)的所有文件夹名称,返回一个string的array

  使用IsolatedStorageFile读写数据:

  StreamWriter和StreamReader用来读取和写入文本信息;

  BinaryWriter和BinaryReader用来读取和写入二进制信息.

  例子:

  如果使用Windows vista或者Windows 7系统,则独立存储的文件在C:\Users\[UserName]\AppData\LocalLow\Microsoft\Silverlight\is目录。

  当然在调试时候也可以看到,如下图:


  创建文件:

IsolatedStorageFile storageFile=IsolatedStorageFile.GetUserStoreForApplication();
IsolatedStorageFileStream myfs = storeFile.CreateFile(filePath);
using (StreamWriter mysw = new StreamWriter(myfs))
{
mysw.WriteLine(content);
}

  通过使用IsolatedStorageFile.CreateFile创建一个文件,得到返回的IsolatedStorageFileStream对象,使用该对象创建StreamWriter对象调用WriteLine方法写入一行数据。

  读取文件:

                  //使用这个方法合并目录和文件路径
string path = System.IO.Path.Combine(this.txtDirectionName.Text,this.txtFileName.Text);
//判断是否存在这个文件
if (storageFile.FileExists(path))
{
//创建一个读取流,参数为OpenIFile方法读取指定位置文件的流
StreamReader sw = new StreamReader(storageFile.OpenFile(path, FileMode.Open, FileAccess.Read));
//读取文件内容
this.txtFileContent.Text = sw.ReadToEnd();
}

  首先判断是否存在该文件,如果存在则调用IsolatedStorageFile.OpenFile函数返回一个IsolatedStorageFileStream对象,使用该对象创建StreamReader对象调用ReadToEnd

  函数得到文本信息。

  删除文件:

 IsolatedStorageFile storageFile=IsolatedStorageFile.GetUserStoreForApplication();
storageFile.DeleteFile(path);

  创建目录:

IsolatedStorageFile storageFile=IsolatedStorageFile.GetUserStoreForApplication();
storageFile.CreateDirectory(path);

  获得列目录(即获得指定目录或者整个应用程序的目录):

IsolatedStorageFile storageFile=IsolatedStorageFile.GetUserStoreForApplication();

storageFile.GetDirectoryNames("*");//当前的*表示获得所有的目录

  删除目录:

 IsolatedStorageFile storageFile=IsolatedStorageFile.GetUserStoreForApplication();
storageFile.DeleteDirectory(path);

  添加空间:

  默认的存储空间是1MB,当程序以OOB模式运行时候,则会增加到25MB,不管是 OOB还是Web模式,都是使用同一个独立存储。

  如果要增加存储空间,则调用IsolatedStorageFile.IncreaseQuotaTo()来增加到想要的空间大小,这里是按字节来算。

  使用该方法需要注意两点:

  1.该方法需要在事件中调用,切忌在Load中调用

  2.该方法增加的值需要大于当前的空间,否则会出现错误

  使用SolatedStorageFile.Quota得到当前独立存储的空间大小。

  使用IsolatedStorageFile.AvailableFreeSpace得到当前可用的独立存储空间大小。

  通过XmlSerializer存储Object对象:

  其实这个功能还是很好用的,也是很有用,通过XmlSerializer将对象进行序列化保存在文件中,当我们需要的时候再通过XmlSerializer进行反序列化得到使用的对象。

  XmlSerializer通过转换字节流对象来实现整个的序列化和反序列化,是可以针对任何Stream的。

  使用XmlSerializer步骤如下:

  1.添加System.Xml.Serializtion.dll

  2.类需要提供一个无参的构造函数

  3.类需要有公有的setter属性构成,当XmlSerializer进行序列化和反序列化的时候则会使用到这些属性,则忽略私有的字段

  下面来一个完整的例子:

  User实体类:

 public class User
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime? DateOfBirth { get; set; }
public User(string firstName, string lastName, DateTime? dateOfBirth)
{
FirstName = firstName;
LastName = lastName;
DateOfBirth = dateOfBirth;
}
public User() { }
}

XAML代码: Grid x:Name =LayoutRoot Background =White Grid.ColumnDefinitions ColumnDefinition / ColumnDefinition ColumnDefinition / ColumnDefinition / Grid.ColumnDefinitions StackPanel Grid.Column =0 L
  

  XAML代码:

<Grid x:Name="LayoutRoot" Background="White">
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0">
<ListBox x:Name="lstUsers"></ListBox>
<Button Height="25" Content="Delete" x:Name="btnDelete" Click="btnDelete_Click"></Button>
</StackPanel>
<StackPanel Grid.Column="1">
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<sdk:Label x:Name="lblFirstName" Content="FirstName" Grid.Row="0" Grid.Column="0" />
<TextBox x:Name="txtFirstName" Grid.Row="0" Grid.Column="1" />
<sdk:Label x:Name="lblLastName" Content="LastName" Grid.Row="1" Grid.Column="0" />
<TextBox x:Name="txtLastName" Grid.Row="1" Grid.Column="1" />
<sdk:Label x:Name="lblDateOfBirth" Content="Date Of Birth"
【上篇】
【下篇】

抱歉!评论已关闭.