使用 SharpZipLib 进行压缩的辅助类,简化压缩字节数组和字符串的操作。

using System;
using System.Text;
using System.IO;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.Zip;

namespace Compression
{
    /**//// <summary>
    /// 压缩方式。
    /// </summary>
    public enum CompressionType
    {
        /**//// <summary>
        /// GZip 压缩格式
        /// </summary>
        GZip,
        /**//// <summary>
        /// BZip2 压缩格式
        /// </summary>
        BZip2,
        /**//// <summary>
        /// Zip 压缩格式
        /// </summary>
        Zip
    }

    /**//// <summary>
    /// 使用 SharpZipLib 进行压缩的辅助类,简化对字节数组和字符串进行压缩的操作。
    /// </summary>
    public class CompressionHelper
    {
        /**//// <summary>
        /// 压缩供应者,默认为 GZip。
        /// </summary>
        public static CompressionType CompressionProvider = CompressionType.GZip;

        Public methods#region Public methods

        /**//// <summary>
        /// 从原始字节数组生成已压缩的字节数组。
        /// </summary>
        /// <param name="bytesToCompress">原始字节数组。</param>
        /// <returns>返回已压缩的字节数组</returns>
        public static byte[] Compress(byte[] bytesToCompress)
        {
            MemoryStream ms = new MemoryStream();
            Stream s = OutputStream(ms);
            s.Write(bytesToCompress, 0, bytesToCompress.Length);
            s.Close();
            return ms.ToArray();
        }

        /**//// <summary>
        /// 从原始字符串生成已压缩的字符串。
        /// </summary>
        /// <param name="stringToCompress">原始字符串。</param>
        /// <returns>返回已压缩的字符串。</returns>
        public static string Compress(string stringToCompress)
        {
            byte[] compressedData = CompressToByte(stringToCompress);
            string strOut = Convert.ToBase64String(compressedData);
            return strOut;
        }

        /**//// <summary>
        /// 从原始字符串生成已压缩的字节数组。
        /// </summary>
        /// <param name="stringToCompress">原始字符串。</param>
        /// <returns>返回已压缩的字节数组。</returns>
        public static byte[] CompressToByte(string stringToCompress)
        {
            byte[] bytData = Encoding.Unicode.GetBytes(stringToCompress);
            return Compress(bytData);
        }

        /**//// <summary>
        /// 从已压缩的字符串生成原始字符串。
        /// </summary>
        /// <param name="stringToDecompress">已压缩的字符串。</param>
        /// <returns>返回原始字符串。</returns>
        public string DeCompress(string stringToDecompress)
        {
            string outString = string.Empty;
            if (stringToDecompress == null)
            {
                throw new ArgumentNullException("stringToDecompress", "You tried to use an empty string");
            }

            try
            {
                byte[] inArr = Convert.FromBase64String(stringToDecompress.Trim());
                outString = Encoding.Unicode.GetString(DeCompress(inArr));
            }
            catch (NullReferenceException nEx)
            {
                return nEx.Message;
            }

            return outString;
        }

        /**//// <summary>
        /// 从已压缩的字节数组生成原始字节数组。
        /// </summary>
        /// <param name="bytesToDecompress">已压缩的字节数组。</param>
        /// <returns>返回原始字节数组。</returns>
        public static byte[] DeCompress(byte[] bytesToDecompress)
        {
            byte[] writeData = new byte[4096];
            Stream s2 = InputStream(new MemoryStream(bytesToDecompress));
            MemoryStream outStream = new MemoryStream();

            while (true)
            {
                int size = s2.Read(writeData, 0, writeData.Length);
                if (size > 0)
                {
                    outStream.Write(writeData, 0, size);
                }
                else
                {
                    break;
                }
            }
            s2.Close();
            byte[] outArr = outStream.ToArray();
            outStream.Close();
            return outArr;
        }

        #endregion

        Private methods#region Private methods

        /**//// <summary>
        /// 从给定的流生成压缩输出流。
        /// </summary>
        /// <param name="inputStream">原始流。</param>
        /// <returns>返回压缩输出流。</returns>
        private static Stream OutputStream(Stream inputStream)
        {
            switch (CompressionProvider)
            {
                case CompressionType.BZip2:
                    return new BZip2OutputStream(inputStream);

                case CompressionType.GZip:
                    return new GZipOutputStream(inputStream);

                case CompressionType.Zip:
                    return new ZipOutputStream(inputStream);

                default:
                    return new GZipOutputStream(inputStream);
            }
        }

        /**//// <summary>
        /// 从给定的流生成压缩输入流。
        /// </summary>
        /// <param name="inputStream">原始流。</param>
        /// <returns>返回压缩输入流。</returns>
        private static Stream InputStream(Stream inputStream)
        {
            switch (CompressionProvider)
            {
                case CompressionType.BZip2:
                    return new BZip2InputStream(inputStream);

                case CompressionType.GZip:
                    return new GZipInputStream(inputStream);

                case CompressionType.Zip:
                    return new ZipInputStream(inputStream);

                default:
                    return new GZipInputStream(inputStream);
            }
        }

        #endregion
    }
}

来源:http://www.mostlylucid.co.uk/archive/2004/04/06/958.aspx

Compression Helper Class using SharpZipLib相关推荐

  1. C#利用ICSharpCode.SharpZipLib.dll压缩文件和解压文件

    /// <summary>  /// 压缩文件  /// </summary> using System; using System.IO; using ICSharpCode ...

  2. 在C#中利用SharpZipLib进行文件的压缩和解压缩

    我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net下载了关于压缩和解压缩的源码,但是下载下来后,面对这么多的代码,一时不知如何下手.只好耐下心来, ...

  3. C#利用SharpZipLib解压或压缩文件夹实例操作

    最近要做一个项目涉及到C#中压缩与解压缩的问题的解决方法,大家分享. 这里主要解决文件夹包含文件夹的解压缩问题. 1)下载SharpZipLib.dll,在http://www.icsharpcode ...

  4. C#压缩解压zip 文件

    我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net下载了关于压缩和解压缩的源码,但是下载下来后,面对这么多的代码,一时不知如何下手.只好耐下心来, ...

  5. 文件 在线压缩 技术

    客户有时会有这样的需求:把服务器上的某个文件和文件夹下载到本地,我们的解决方法是使用在线压缩技术.就是把文件先在服务器上压缩,创建一个.ZIP,然后下载到本地. 网上提供了原代码,但是有些不足之处.第 ...

  6. c#解压,压缩文件!!!

    最近要做一个项目涉及到C#中压缩与解压缩的问题的解决方法,大家分享. 这里主要解决文件夹包含文件夹的解压缩问题. 1)下载SharpZipLib.dll,在http://www.icsharpcode ...

  7. 终于知道为什么NVIDIA的linux驱动这么烂了,一波官方文档告诉你:Linux GPU Driver Developer’s Guide

    还记得Linus在记者会上那句话吗? so,NVIDIA, F**k you! https://www.kernel.org/doc/html/latest/gpu/index.html Linux ...

  8. Visual Studio 2008项目打包问题——项目太大C盘空间不够怎么办?

    很多人在项目打包过程中都会遇到这样一个问题,数据库或者某个文件太大(几百兆甚至几个G),打包时Visual Studio会提示C盘存储空间不够.通常情况下,我们会选择采用分区软件重新分配给C盘更多的空 ...

  9. C#.NET程序尝试—修复Excel批注错误

    Excel2007打不开xlsx文件,这在我的日常工作中是非常常见的现象,究其原因是因为大家用的Excel版本五花八门,而恰好不同版本的Excel的xml代码规范又不一样,于是一个用Excel2013 ...

最新文章

  1. 傅里叶变换性质证明卷积_傅里叶变换(三) 采样与离散序列
  2. python包含某个数字_python编程练习---有序数组中,快速查找是否包含指定数字,并返回其下标...
  3. java 多线程 8 : 线程通信
  4. Android APK系列4-------Android编译APK后的系统结构
  5. H3C大规模路由综合实验
  6. java long类型6_Java学习6——基本数据类型及其转换
  7. 添加控件并处理事件(纯手写)
  8. linux设置汉语输入法,在Deepin系统下使用韩语(韩文)输入法的方法
  9. 【数学建模】预测模型之BP网络预测
  10. 共享打印机时,出现无法访问,你可能没有权限使用网络资源“
  11. 这个被上帝抛弃的国家,创立了全球一半的科技公司
  12. python的turtle的正六角形简洁画法
  13. ARCGIS中坐标转换及地理坐标、投影坐标的定义(转载)
  14. c语言撩妹小程序,撩妹简单的web小程序!分享给大家~~~~~~
  15. 李刚疯狂java讲义第3_【Java】-NO.16.EBook.4.Java.1.009-【疯狂Java讲义第3版 李刚】- 泛型...
  16. 转贴一个关于DTO DAO VO BO PO POJO的^_^
  17. 结构力学计算机矩阵位移法,结构力学-矩阵位移法.ppt
  18. 快手如何直播引流?快手直播推广方法分享
  19. 《Linux创建新用户》
  20. 电脑上做的ppt拿到别的电脑或手机上播放的时候字体错位的解决方法

热门文章

  1. Java Json API:Gson使用简单入门
  2. 1112: 零起点学算法19——输出特殊值
  3. AngularJS-Basic(一)
  4. PHP - 如何实现跨域
  5. android sqlite操作(2)
  6. 浅谈企业IT应用的访问方式之:乱想
  7. 初创公司面试要问什么_聘请初创公司的产品设计师时要问的问题
  8. 手动部署OpenStack环境(二:CentOS6.6虚拟机的安装及配置)
  9. 【Linux学习笔记】 -- 基本Shell命令
  10. 7纳米duv和euv_要超车台积电 三星宣布采用EUV技术7纳米制程完成验证