C#基础知识之SharpZipLib压缩解压的使用
项目中使用 Velocity 将模板和生成的动态内容(HTML、XML等)合并保存到redis数据库中,考虑到压缩的文件容量会比较小,方便传输而且存储所使用的空间也会比较小,所以要压缩一下,读取的时候也要解压,所以就用到了SharpZipLib。SharpZipLib是一个完全用c#为. net平台编写的Zip、GZip、Tar和BZip2库。官网代码下载https://github.com/icsharpcode/SharpZipLib。如果要使用SharpZipLib,我们可以直接下载源码引入项目,也可以下载SharpZLib.dll。SharpZLib.dll可以从网上下载也可以通过代码自己生成dill。
压缩分为无损压缩和有损压缩,有损压缩指的是压缩之后就无法完整还原原始信息,但是压缩率可以很高,主要应用于视频、话音等数据的压缩,如果没必要完整还原信息,可以使用有损压缩,仅仅损失了一点信息,很难察觉;无损压缩则用于文件等等必须完整还原信息的场合,常见的无损压缩包括Zip、GZip、RAR、Tar、BZip2等。
一、如何使用SharpZipLib
1、项目中引用SharpZLib.dll。
2、本项目中,单独写了一个ZipHelper类,用来使用SharpZipLib中封装的压缩方式。zipHelper类时可以作为使用Zip、Tar、GZip、Lzw、BZip2压缩方式的入口。直接上ZipHelper类的代码吧
- using SharpZipLib.BZip2;
- using SharpZipLib.Checksum;
- using SharpZipLib.Core.Exceptions;
- using SharpZipLib.GZip;
- using SharpZipLib.Tar;
- using SharpZipLib.Zip;
- using SharpZipLib.Zip.Compression;
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Text;
- namespace SharpZipLibExample
- {
- /// <summary>
- /// 网上关于压缩的知识很多
- /// https://www.cnblogs.com/kissdodog/p/3525295.html
- /// </summary>
- public class ZipHelper
- {
- private const int BUFFER_LENGTH = ;
- #region Zip
- /// <summary>
- /// Zip文件压缩
- /// ZipOutputStream:相当于一个压缩包;
- /// ZipEntry:相当于压缩包里的一个文件;
- /// 以上两个类是SharpZipLib的主类。
- /// </summary>
- /// <param name="sourceFileLists"></param>
- /// <param name="descFile">压缩文件保存的目录</param>
- /// <param name="compression">压缩级别</param>
- public static void ZipCompress(List<string> sourceFileLists, string descFile, int compression)
- {
- if (compression < || compression > )
- {
- throw new ArgumentException("错误的压缩级别");
- }
- if (!Directory.Exists(new FileInfo(descFile).Directory.ToString()))
- {
- throw new ArgumentException("保存目录不存在");
- }
- foreach (string c in sourceFileLists)
- {
- if (!File.Exists(c))
- {
- throw new ArgumentException(string.Format("文件{0} 不存在!", c));
- }
- }
- Crc32 crc32 = new Crc32();
- using (ZipOutputStream stream = new ZipOutputStream(File.Create(descFile)))
- {
- stream.SetLevel(compression);
- ZipEntry entry;
- for (int i = ; i < sourceFileLists.Count; i++)
- {
- entry = new ZipEntry(Path.GetFileName(sourceFileLists[i]));
- entry.DateTime = DateTime.Now;
- using (FileStream fs = File.OpenRead(sourceFileLists[i]))
- {
- byte[] buffer = new byte[fs.Length];
- fs.Read(buffer, , buffer.Length);
- entry.Size = fs.Length;
- crc32.Reset();
- crc32.Update(buffer);
- entry.Crc = crc32.Value;
- stream.PutNextEntry(entry);
- stream.Write(buffer, , buffer.Length);
- }
- stream.CloseEntry();
- }
- }
- }
- /// <summary>
- /// unZip文件解压缩
- /// </summary>
- /// <param name="sourceFile">要解压的文件</param>
- /// <param name="path">要解压到的目录</param>
- public static void ZipDeCompress(string sourceFile, string path)
- {
- if (!File.Exists(sourceFile))
- {
- throw new ArgumentException("要解压的文件不存在。");
- }
- if (!Directory.Exists(path))
- {
- throw new ArgumentException("要解压到的目录不存在!");
- }
- using (ZipInputStream s = new ZipInputStream(File.OpenRead(sourceFile)))
- {
- ZipEntry theEntry;
- while ((theEntry = s.GetNextEntry()) != null)
- {
- string fileName = System.IO.Path.GetFileName(theEntry.Name);
- if (fileName != string.Empty)
- {
- using (FileStream streamWriter = File.Create(path + @"\" + theEntry.Name))
- {
- int size = ;
- byte[] data = new byte[];
- while (true)
- {
- size = s.Read(data, , data.Length);
- if (size > )
- {
- streamWriter.Write(data, , size);
- }
- else
- {
- break;
- }
- }
- }
- }
- }
- }
- }
- /// <summary>
- /// 字符串压缩
- /// </summary>
- /// <param name="text">待压缩的字符串</param>
- /// <returns>已压缩的字符串</returns>
- public static string ZipCompress(string text)
- {
- string result = string.Empty;
- byte[] data = Encoding.UTF8.GetBytes(text);
- byte[] dData = ZipCompress(data);
- result = Convert.ToBase64String(dData);
- Array.Clear(dData, , dData.Length);
- return result;
- }
- /// <summary>
- /// 字符串解压
- /// </summary>
- /// <param name="text">待解压的字符串</param>
- /// <returns>已解压的字符串</returns>
- public static string ZipDeCompress(string text)
- {
- string result = string.Empty;
- byte[] data = Convert.FromBase64String(text);
- byte[] dData = ZipDeCompress(data);
- result = Encoding.UTF8.GetString(dData);
- Array.Clear(dData,,dData.Length);
- return result;
- }
- /// <summary>
- /// 字节数组压缩
- /// </summary>
- /// <param name="data">待压缩的字节数组</param>
- /// <param name="isClearData">压缩完成后,是否清除待压缩字节数组里面的内容</param>
- /// <returns>已压缩的字节数组</returns>
- public static byte[] ZipCompress(byte[] data, bool isClearData = true)
- {
- byte[] bytes = null;
- Deflater f = new Deflater(Deflater.BEST_COMPRESSION);
- f.SetInput(data);
- f.Finish();
- int count = ;
- using (MemoryStream o=new MemoryStream(data.Length))
- {
- byte[] buffer = new byte[BUFFER_LENGTH];
- while (!f.IsFinished)
- {
- count = f.Deflate(buffer);
- o.Write(buffer,,count);
- }
- bytes = o.ToArray();
- }
- if (isClearData)
- {
- Array.Clear(data,,data.Length);
- }
- return bytes;
- }
- /// <summary>
- /// 字节数组解压缩
- /// </summary>
- /// <param name="data">待解压缩的字节数组</param>
- /// <param name="isClearData">解压缩完成后,是否清除待解压缩字节数组里面的内容</param>
- /// <returns>已解压的字节数组</returns>
- public static byte[] ZipDeCompress(byte[] data, bool isClearData = true)
- {
- byte[] bytes = null;
- Inflater f = new Inflater();
- f.SetInput(data);
- int count = ;
- using (MemoryStream o=new MemoryStream(data.Length))
- {
- byte[] buffer = new byte[BUFFER_LENGTH];
- while (!f.IsFinished)
- {
- count = f.Inflate(buffer);
- o.Write(buffer,,count);
- }
- bytes = o.ToArray();
- }
- if (isClearData)
- {
- Array.Clear(data,,count);
- }
- return bytes;
- }
- #endregion
- #region GZip
- /// <summary>
- /// 压缩字符串
- /// </summary>
- /// <param name="text">待压缩的字符串组</param>
- /// <returns>已压缩的字符串</returns>
- public static string GZipCompress(string text)
- {
- string result = string.Empty;
- byte[] data = Encoding.UTF8.GetBytes(text);
- byte[] cData = GZipCompress(data);
- result = Convert.ToBase64String(cData);
- Array.Clear(cData, , cData.Length);
- return result;
- }
- /// <summary>
- /// 解压缩字符串
- /// </summary>
- /// <param name="text">待解压缩的字符串</param>
- /// <returns>已解压缩的字符串</returns>
- public static string GZipDeCompress(string text)
- {
- string result = string.Empty;
- byte[] data = Convert.FromBase64String(text);
- byte[] cData = GZipDeCompress(data);
- result = Encoding.UTF8.GetString(cData);
- Array.Clear(cData, , cData.Length);
- return result;
- }
- /// <summary>
- /// 压缩字节数组
- /// </summary>
- /// <param name="data">待压缩的字节数组</param>
- /// <param name="isClearData">压缩完成后,是否清除待压缩字节数组里面的内容</param>
- /// <returns>已压缩的字节数组</returns>
- public static byte[] GZipCompress(byte[] data, bool isClearData = true)
- {
- byte[] bytes = null;
- try
- {
- using (MemoryStream o = new MemoryStream())
- {
- using (Stream s = new GZipOutputStream(o))
- {
- s.Write(data, , data.Length);
- s.Flush();
- }
- bytes = o.ToArray();
- }
- }
- catch (SharpZipBaseException)
- {
- }
- catch (IndexOutOfRangeException)
- {
- }
- if (isClearData)
- Array.Clear(data, , data.Length);
- return bytes;
- }
- /// <summary>
- /// 解压缩字节数组
- /// </summary>
- /// <param name="data">待解压缩的字节数组</param>
- /// <param name="isClearData">解压缩完成后,是否清除待解压缩字节数组里面的内容</param>
- /// <returns>已解压的字节数组</returns>
- public static byte[] GZipDeCompress(byte[] data, bool isClearData = true)
- {
- byte[] bytes = null;
- try
- {
- using (MemoryStream o = new MemoryStream())
- {
- using (MemoryStream ms = new MemoryStream(data))
- {
- using (Stream s = new GZipInputStream(ms))
- {
- s.Flush();
- int size = ;
- byte[] buffer = new byte[BUFFER_LENGTH];
- while ((size = s.Read(buffer, , buffer.Length)) > )
- {
- o.Write(buffer, , size);
- }
- }
- }
- bytes = o.ToArray();
- }
- }
- catch (SharpZipBaseException)
- {
- }
- catch (IndexOutOfRangeException)
- {
- }
- if (isClearData)
- Array.Clear(data, , data.Length);
- return bytes;
- }
- #endregion
- #region Tar
- /// <summary>
- /// 压缩字符串
- /// </summary>
- /// <param name="text">待压缩的字符串组</param>
- /// <returns>已压缩的字符串</returns>
- public static string TarCompress(string text)
- {
- string result = null;
- byte[] data = Encoding.UTF8.GetBytes(text);
- byte[] dData = TarCompress(data);
- result = Convert.ToBase64String(dData);
- Array.Clear(dData, , dData.Length);
- return result;
- }
- /// <summary>
- /// 解压缩字符串
- /// </summary>
- /// <param name="text">待解压缩的字符串</param>
- /// <returns>已解压的字符串</returns>
- public static string TarDeCompress(string text)
- {
- string result = null;
- byte[] data = Convert.FromBase64String(text);
- byte[] dData = TarDeCompress(data);
- result = Encoding.UTF8.GetString(dData);
- Array.Clear(dData, , dData.Length);
- return result;
- }
- /// <summary>
- /// 压缩字节数组
- /// </summary>
- /// <param name="data">待压缩的字节数组</param>
- /// <param name="isClearData">压缩完成后,是否清除待压缩字节数组里面的内容</param>
- /// <returns>已压缩的字节数组</returns>
- public static byte[] TarCompress(byte[] data, bool isClearData = true)
- {
- byte[] bytes = null;
- using (MemoryStream o = new MemoryStream())
- {
- using (Stream s = new TarOutputStream(o))
- {
- s.Write(data, , data.Length);
- s.Flush();
- }
- bytes = o.ToArray();
- }
- if (isClearData)
- Array.Clear(data, , data.Length);
- return bytes;
- }
- /// <summary>
- /// 解压缩字节数组
- /// </summary>
- /// <param name="data">待解压缩的字节数组</param>
- /// <param name="isClearData">解压缩完成后,是否清除待解压缩字节数组里面的内容</param>
- /// <returns>已解压的字节数组</returns>
- public static byte[] TarDeCompress(byte[] data, bool isClearData = true)
- {
- byte[] bytes = null;
- using (MemoryStream o = new MemoryStream())
- {
- using (MemoryStream ms = new MemoryStream(data))
- {
- using (Stream s = new TarInputStream(ms))
- {
- s.Flush();
- int size = ;
- byte[] buffer = new byte[BUFFER_LENGTH];
- while ((size = s.Read(buffer, , buffer.Length)) > )
- {
- o.Write(buffer, , size);
- }
- }
- }
- bytes = o.ToArray();
- }
- if (isClearData)
- Array.Clear(data, , data.Length);
- return bytes;
- }
- #endregion
- #region BZip
- /// <summary>
- /// 压缩字符串
- /// </summary>
- /// <param name="text">待压缩的字符串组</param>
- /// <returns>已压缩的字符串</returns>
- public static string BZipCompress(string text)
- {
- string result = null;
- byte[] data = Encoding.UTF8.GetBytes(text);
- byte[] dData = BZipCompress(data);
- result = Convert.ToBase64String(dData);
- Array.Clear(dData, , dData.Length);
- return result;
- }
- /// <summary>
- /// 解压缩字符串
- /// </summary>
- /// <param name="text">待解压缩的字符串</param>
- /// <returns>已解压的字符串</returns>
- public static string BZipDeCompress(string text)
- {
- string result = null;
- byte[] data = Convert.FromBase64String(text);
- byte[] dData = BZipDeCompress(data);
- result = Encoding.UTF8.GetString(dData);
- Array.Clear(dData, , dData.Length);
- return result;
- }
- /// <summary>
- /// 压缩字节数组
- /// </summary>
- /// <param name="data">待压缩的字节数组</param>
- /// <param name="isClearData">压缩完成后,是否清除待压缩字节数组里面的内容</param>
- /// <returns>已压缩的字节数组</returns>
- public static byte[] BZipCompress(byte[] data, bool isClearData = true)
- {
- byte[] bytes = null;
- using (MemoryStream o = new MemoryStream())
- {
- using (Stream s = new BZip2OutputStream(o))
- {
- s.Write(data, , data.Length);
- s.Flush();
- }
- bytes = o.ToArray();
- }
- if (isClearData)
- Array.Clear(data, , data.Length);
- return bytes;
- }
- /// <summary>
- /// 解压缩字节数组
- /// </summary>
- /// <param name="data">待解压缩的字节数组</param>
- /// <param name="isClearData">解压缩完成后,是否清除待解压缩字节数组里面的内容</param>
- /// <returns>已解压的字节数组</returns>
- public static byte[] BZipDeCompress(byte[] data, bool isClearData = true)
- {
- byte[] bytes = null;
- using (MemoryStream o = new MemoryStream())
- {
- using (MemoryStream ms = new MemoryStream(data))
- {
- using (Stream s = new BZip2InputStream(ms))
- {
- s.Flush();
- int size = ;
- byte[] buffer = new byte[BUFFER_LENGTH];
- while ((size = s.Read(buffer, , buffer.Length)) > )
- {
- o.Write(buffer, , size);
- }
- }
- }
- bytes = o.ToArray();
- }
- if (isClearData)
- Array.Clear(data, , data.Length);
- return bytes;
- }
- #endregion
- }
- }
3、程序入口main
- using System;
- using System.Linq;
- using System.Text;
- namespace SharpZipLibExample
- {
- class Program
- {
- static void Main(string[] args)
- {
- string strContent = "夜,结束了一天的喧嚣后安静下来,伴随着远处路灯那微弱的光。风,毫无预兆地席卷整片旷野,撩动人的思绪万千。星,遥遥地挂在天空之中,闪烁着它那微微星光,不如阳光般灿烂却如花儿般如痴如醉。";
- Console.WriteLine("原文:{0}",strContent);
- #region 压缩
- string compressContent = ZipHelper.BZipCompress(strContent);
- Console.WriteLine("压缩后的内容:{0};压缩后的内容大小:{1}", compressContent, Convert.FromBase64String(compressContent).Count().ToString());
- #endregion
- #region 解压缩
- strContent = ZipHelper.BZipDeCompress(compressContent);
- Console.WriteLine("解压缩后的内容:{0};解压缩后的内容大小:{1}", strContent,Encoding.UTF8.GetBytes(strContent).Count().ToString());
- #endregion
- Console.ReadKey();
- }
- }
- }
SharpZipLib的详细解析详见 https://www.cnblogs.com/kissdodog/p/3525295.html
完整的Demo下载地址https://download.csdn.net/download/u011392711/10827889
C#基础知识之SharpZipLib压缩解压的使用的更多相关文章
- .NET使用ICSharpCode.SharpZipLib压缩/解压文件
SharpZipLib是国外开源加压解压库,可以方便的对文件进行加压/解压 1.下载ICSharpCode.SharpZipLib.dll,并复制到bin目录下 http://www.icsharpc ...
- SharpZipLib压缩解压
一.介绍 SharpZipLib是一个完全由C#编写的ZIP,GZIP,Tar和BZIP2 Library,可以方便的支持这几种格式的压缩和解压缩. https://github.com/icshar ...
- ICSharpCode.SharpZipLib压缩解压
一.使用ICSharpCode.SharpZipLib.dll: 下载地址 http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.asp ...
- SharpZipLib压缩解压的使用
项目中使用 Velocity 将模板和生成的动态内容(HTML.XML等)合并保存到redis数据库中,考虑到压缩的文件容量会比较小,方便传输而且存储所使用的空间也会比较小,所以要压缩一下,读取的时候 ...
- C#使用SharpZipLib压缩解压文件
#region 加压解压方法 /// <summary> /// 功能:压缩文件(暂时只压缩文件夹下一级目录中的文件,文件夹及其子级被忽略) /// </summary> // ...
- 通过SharpZipLib来压缩解压文件
在项目开发中,一些比较常用的功能就是压缩解压文件了,其实类似的方法有许多 ,现将通过第三方类库SharpZipLib来压缩解压文件的方法介绍如下,主要目的是方便以后自己阅读,当然可以帮到有需要的朋友更 ...
- 使用SharpZIpLib写的压缩解压操作类
使用SharpZIpLib写的压缩解压操作类,已测试. public class ZipHelper { /// <summary> /// 压缩文件 /// </summary&g ...
- huffman压缩解压文件【代码】
距离上次写完哈夫曼编码已经过去一周了,这一周都在写huffman压缩解压,哎,在很多小错误上浪费了很多时间调bug.其实这个程序的最关键部分不是我自己想的,而是借鉴了某位园友的代码,但是,无论如何,自 ...
- (转载)C#压缩解压zip 文件
转载之: C#压缩解压zip 文件 - 大气象 - 博客园http://www.cnblogs.com/greatverve/archive/2011/12/27/csharp-zip.html C# ...
随机推荐
- Spring的Aop理解
主要作用:解决代码复用,避免重复性编写代码. 比较典型的场景:日志打印,权限验证,事务处理 参考网址为:http://moon-walker.iteye.com/blog/2381532 spring ...
- linux命令--truncate 学习
truncate命令可以将一个文件缩小或者扩展到某个给定的大小 可以利用该命令和-s选项来特别指定文件的大小 1.清空一个文件内容,尤其是log 2. truncate -s 0 test
- JVM监控工具之jmap、jstat、stack、jps、jstatd、jinfo、jhat、jdb
1.jdb(The Java Debuger) jdb 用来对core文件和正在运行的Java进程进行实时地调试,里面包含了丰富的命令帮助您进行调试,它的功能和Sun studio里面所带的dbx非常 ...
- 【Qt开发】解决Qt5.7.0中文显示乱码的问题
[Qt开发]解决Qt5.7.0中文显示乱码的问题 亲测可用: 乱码主要是编码格式的问题,这里可以通过Edit菜单中选择当前文档的编码方式,选择按照UTF-8格式保存,然后输入对应的中文,保存,然后运行 ...
- Windows.命令行(CMD)_执行命令&环境变量
1.CMD命令中如果 命令有换行的话,就使用 ^来连接(这就类似于 Linux命令行中 \ 的作用) 2.环境变量 2.1.显示 所有环境变量的值,命令:set 2.2.显示 某个环境变量的值,命令 ...
- Java中类和接口
很形象的接口的使用——针对初学者 里氏代换原则是什么?听起来很高深,不过我们也不是什么学院派,就不讲大道理了,直接拿个例子来说一下. 我们拿人和程序员举个例子.人是一个大类,程序员是继承自人的子类.看 ...
- if——while表达式详解
①while循环的表达式是循环进行的条件,用作循环条件的表达式中一般至少包括一个能够改变表达式的变量,这个变量称为循环变量 ②当表达式的值为真(非零)(非空)时,执行循环体:为假(0)时,则循环结束 ...
- Linux系统常用命令之top
top - 06:58:37 up 7 days, 23:36, 2 users, load average: 0.00, 0.01, 0.05Tasks: 716 total, 1 running, ...
- js swich
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 期货、股指期权、ETF期权
期货与期权: 期权是指一种合约,该合约赋予持有人在某一特定日期或该日之前的任何时间以固定价格购进或售出某种资产的权利. 期货是标准化的合约,赋予参与者在未来的某个时间点以约定好的一个价格去买入或者卖出 ...