找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3332|回复: 0

C#xml的压缩与解压还原(使用系统自带的压缩与解压)源码分享

[复制链接]
发表于 2012-2-21 23:12:03 | 显示全部楼层 |阅读模式
在网上搜索了很多关于xml的压缩与解压的问题,解决方案比较多的是采用开源或者别的组件来实现xml的压缩与解压的,但却找不到系统自身的最简单的实现方式。
其实原理很简单,把xml转成string,然后对string进行压缩。解压就是其逆向的过程。
功能不复杂,下面不多说,直接代码了:
  1. using System;
  2. using System.Text;
  3. using System.IO;
  4. using System.IO.Compression;
  5. namespace 努力偷懒.Commonds
  6. {
  7.     /// <summary>
  8.     /// 使用系统默认压缩流的方法进行压缩并保存成文件,
  9.     /// 约定1:文件前面8个字节保存的是long类型,存储的是字符串压缩前的字节长度。
  10.     /// </summary>
  11.     public class ZipFileHelper
  12.     {
  13.         public static long WriteString(string fileName, string data)
  14.         {
  15.             long lResult = 0;
  16.             byte[] bs = Encoding.UTF8.GetBytes(data);
  17.             MemoryStream ms = new MemoryStream();
  18.             //创建文件流
  19.             FileStream fs = new FileStream(fileName, FileMode.Create);
  20.             try
  21.             {
  22.                 DeflateStream compressedzipStream = null;
  23.                 try
  24.                 {
  25.                     compressedzipStream = new DeflateStream(ms, CompressionMode.Compress, true);
  26.                     compressedzipStream.Write(bs, 0, bs.Length);//把bs中的数据进行二进制压缩后写入到ms中。
  27.                     lResult = ms.Length;
  28.                 }
  29.                 finally
  30.                 {
  31.                     if (null != compressedzipStream)
  32.                         compressedzipStream.Close();
  33.                 }
  34.                 byte[] bl = BitConverter.GetBytes((long)bs.Length);//把没有压缩的数据长度保存下来,以在还原时使用。
  35.                 fs.Write(bl, 0, bl.Length);
  36.                 ms.WriteTo(fs);
  37.                 fs.Flush();
  38.             }
  39.             finally
  40.             {
  41.                 fs.Close();
  42.                 ms.Close();
  43.             }
  44.             return lResult;
  45.         }
  46.         /// <summary>
  47.         /// 解压,返回byte数组
  48.         /// </summary>
  49.         /// <param name="fileName"></param>
  50.         /// <returns></returns>
  51.         public static byte[] LoadBytes(string fileName)
  52.         {
  53.             //源数据长度的byte数据
  54.             byte[] bs;
  55.             long nSize;//bs转换后的实际值
  56.             //结果
  57.             byte[] decompressBuffer;
  58.             FileStream fs = new FileStream(fileName, FileMode.Open);
  59.             try
  60.             {
  61.                 //读入源数据的字节长度
  62.                 byte[] bl = new byte[8];
  63.                 fs.Read(bl, 0, 8);
  64.                 nSize = BitConverter.ToInt64(bl, 0);
  65.                 //把文件流中字符的二进制数据写入到bs数组中
  66.                 bs = new byte[fs.Length - 8];
  67.                 fs.Read(bs, 0, (int)fs.Length - 8);
  68.             }
  69.             finally
  70.             {
  71.                 fs.Close();
  72.             }
  73.             //bs数据写入到ms流中
  74.             MemoryStream ms = new MemoryStream();
  75.             DeflateStream DecompressedzipStream=null;
  76.             try
  77.             {
  78.                 ms.Write(bs, 0, bs.Length);
  79.                 ms.Position = 0;
  80.                 //解压
  81.                 DecompressedzipStream = new DeflateStream(ms, CompressionMode.Decompress);
  82.                 DecompressedzipStream.Flush();
  83.                 //解压后的数据
  84.                 decompressBuffer = new byte[nSize];
  85.                 DecompressedzipStream.Read(decompressBuffer, 0, decompressBuffer.Length);
  86.             }
  87.             finally
  88.             {
  89.                 if (null != DecompressedzipStream)
  90.                     DecompressedzipStream.Close();
  91.                 if (null!=ms )
  92.                     ms.Close();
  93.             }
  94.             return decompressBuffer;
  95.         }
  96.     }
  97. }
复制代码

原创作品出自努力偷懒,转载请说明文章出处:http://blog.csdn.net/kfarvidhttp://www.cnblogs.com/kfarvid/

您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-4 01:40 , Processed in 0.018747 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表