文件系统数据(四)——读写压缩文件、序列化对象、监控文件结构//20131104~20131105

十、读写压缩文件
    System.IO.Compression名称空间包含能压缩代码中文件的类,这些类使用GZIP或Deflate算法。
    System.IO.Compression名称空间中有两个压缩流类DeflateStream和GZipStream,它们的工作方式非常类似。对于这两个类,都要用已有的流初始化它们,对于文件,流就是FileStream对象。之后就可以把它们用于StreamReader和StreamWriter了,就像使用期货流一样。只需在顶部指定流是用于压缩(保存文件)还是解压缩(加载文件),类就知道要对传送给它的数据执行什么操作。例:
(1)保存已压缩的文本文件。
    static void SaveCompressedFile(string filename, string data)
        {
            //创建FileStream对象
            FileStream fileStream = new FileStream(filename ,FileMode.Create ,FileAccess .Write);
            //创建GZipStream对象(可用DeflateStream替换这段代码中的所有GZipStream);使用 CompressionMode.Compress枚举值指定数据要进行压缩
            GZipStream compressionStream = new GZipStream(fileStream, CompressionMode.Compress);
            StreamWriter writer = new StreamWriter(compressionStream );
            //使用StreamWriter 把数据写入文件。
            writer.Write(data);
            writer.Close();
        }
(2)把压缩的文件加载到字符串中
 static string LoadCompressedFile(string filename)
        {
            FileStream fileStream = new FileStream(filename ,FileMode.Open ,FileAccess .Read );
            GZipStream compressionStream = new GZipStream(fileStream ,CompressionMode.Decompress);
            StreamReader reader = new StreamReader(compressionStream );
            string data = reader.ReadToEnd();
            reader.Close();
            return data;
        }
    其区别很显然:使用了不同的FileMode、FileAccess和CompressionMode枚举值来加载、解压缩文件,使用StreamReader从文件中提取出未压缩的文本。
    存储在压缩文件中的文本是不可读的,这说明可以在应用程序之间共享数据,因为文件是用已知的算法压缩的,应用程序肯定知道如何解压缩。

十一、序列化对象
    应用程序常常需要在硬盘上存储数据,逐段构建文本和数据文件常常不是最方便的方式,有时最好以对象的形式存储数据。
 1、   .NET Framework 在System.Runtime.Serialization和System.Runtime.Serialization.Formatters名称空间中提供了序列化对象的基础架构,这两个名称空间中的一些类实现了这个基础架构。Framework中有两个可用的实现方式:
(1)System.Runtime.Serialization.Formatters.Binary:这个名称空间包含了BinaryFormatter类,它能把对象序列化为二进制数据,把二进制数据序列化为对象。
(2)System.Runtime.Serialization.Formatters.Soap:这个名称空间包含了SoapFormatter类,它能把对象序列化为SOAP格式的XML数据,把SOAP格式的XML数据序列化为对象。

 2、 IFormatter接口提供了以下方法:
(1)void Serialize(Stream stream,object source):把source序列化为stream
(2)object Deserialize(Stream stream):解序stream中的数据,返回得到的对象

3、使用BinaryFormatter进行序列化:
  IFormatter serializer=new BinaryFormatter();
  serializer.Serialize(myStream,myObject);
  解序:
  IFormatter serializer=new BinaryFormatter();
  MyObjectType myNewObject=serializer.Deserialize(myStream) as MyObjectType;
  显然,需要流和对象才能进行处理。

4、.NET Framework要求把对象标记为可序列化,才能序列化它们。因为:
(1)一些对象序列化的效果不好。它们需要引用只有它们本身位于内存中时才存在的本地数据。
(2)一些对象包含敏感的数据,这些数据不应以不安全的方式保存或传送到另一个进程中。
    使用Serializable属性就可以把对象标记为可序列化。这个属性并没有由派生类继承,它必须应用于要进行序列化的每个类。

十二、监控文件结构
    有时,应用程序所需要完成的工作不仅仅限于从文件系统中读写文件。例如,知道修改文件或目录的时间非常重要。帮助完成这些任务的类是FileSystemWatcher。这个类提供了几个应用程序可以捕获的事件。
    使用FileSystemWatcher的基本过程:首先必须设置一些属性,指定监控的位置、内容以及引发应用程序要处理的事件的时间。然后给FileSystemWatcher提供定制事件处理程序的地址,当发生重要事件时,FileSystemWatcher就调用这些属性。然后打开FileSystem Watcher,等待事件。
    在启用FileSystemWatcher对象之前必须设置的属性如下:
(1)Path:它设置要监控的文件位置或目录
(2)NotifyFilter:这是NotifyFilters枚举值的组合,NotifyFilters枚举值规定在被监控的文件内要监控哪些内容。这些表示要监控的文件或文件夹的属性。如果规定的属性发生了变化,就引发事件。可能的枚举值是:Attributes、CreationTime、DirectoryName、FileName、LastAccess、LastWrite、Securtiy和Size。可以通过二元OR操作符来合并这些枚举值
(3)Filter:监控文件的过滤器,例如,*.txt
     设置之后,就必须为4个事件Changed、Created、Deleted和Renamed编写事件处理程序。这需要创建自己的方法,并将方法赋给对象的事件。将自己的事件处理程序赋给这些方法,就可以在引发事件时调用方法。当修改与Path、NotifyFilter和Filter属性匹配的文件或目录时,就引发第一个事件。
     在设置了属性和事件之后,将EnableRaisingEvents属性设置为true,就可以开始监控工作。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值