C#压缩解压Helper

C#通过自带的System.IO.Compression、System.IO.Compression.FileSystem进行压缩和解压,使用以下Helper

using System.IO;
using System.IO.Compression;

namespace LinqXml
{
    public class CompressionHelper
    {
        #region ------------------------------------------------------------------1、解压文件为一个文件或文件夹
        /// <summary>
        /// 解压文件为一个文件或文件夹
        /// </summary>
        /// <param name="sourceFile">源文件:准备解压的压缩文件</param>
        /// <param name="destinationDirectory">目标目录:解压缩之后的文件存放位置</param>
        public static void DeCompressToDirectory(string sourceFile, string destinationDirectory)
        {
            if (!File.Exists(sourceFile)) throw new FileNotFoundException();
            ZipFile.ExtractToDirectory(sourceFile, destinationDirectory);            
        }
        #endregion

        #region ------------------------------------------------------------------2、压缩文件夹或目录为一个文件
        /// <summary>
        /// 压缩一个文件夹或目录为一个文件
        /// </summary>    
        /// <param name="sourceDirectory">源文件:准备压缩的文件夹</param>
        /// <param name="destinationFile">目标文件:压缩后保存的文件</param>
        public static void CompressFromDirectory(string sourceDirectory, string destinationFile)
        {
            if (!Directory.Exists(sourceDirectory)) throw new DirectoryNotFoundException();
            ZipFile.CreateFromDirectory(sourceDirectory, destinationFile);
        }
        #endregion


        #region ------------------------------------------------------------------3、压缩一个文件为一个文件
        /// <summary>
        /// 压缩一个文件为一个文件
        /// </summary>
        /// <param name="sourceFile">源文件:准备压缩的文件</param>
        /// <param name="destinationFile">目标文件:压缩后保存的文件</param>
        public static void CompressFromFile(string sourceFile, string destinationFile)
        {
            if (!File.Exists(sourceFile)) throw new FileNotFoundException();

            using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open))
            {
                byte[] quartetBuffer = new byte[4];
                const int bufferLength = 1024 * 64;
                /*压缩文件的流的最后四个字节保存的是文件未压缩前的长度信息,
                 * 把该字节数组转换成int型,可获取文件长度。
                 * int position = (int)sourceStream.Length - 4;
                sourceStream.Position = position;
                sourceStream.Read(quartetBuffer, 0, 4);
                sourceStream.Position = 0;
                int checkLength = BitConverter.ToInt32(quartetBuffer, 0);*/

                byte[] buffer = new byte[1024 * 64];
                using (GZipStream decompressedStream = new GZipStream(sourceStream, CompressionMode.Compress, true))
                {
                    using (FileStream destinationStream = new FileStream(destinationFile, FileMode.Create))
                    {
                        int bytesRead = 0;
                        while ((bytesRead = decompressedStream.Read(buffer, 0, bufferLength)) >= bufferLength)
                        {
                            destinationStream.Write(buffer, 0, bufferLength);
                        }
                        destinationStream.Write(buffer, 0, bytesRead);
                        destinationStream.Flush();
                    }
                }
            }
        }
        #endregion

        #region ------------------------------------------------------------------4、解压一个文件为一个文件
        /// <summary>
        /// 解压一个文件为一个文件
        /// </summary>
        /// <param name="sourceFile">源文件</param>
        /// <param name="destinationFile">目标文件</param>
        public static void DeCompressToFile(string sourceFile, string destinationFile)
        {
            if (!File.Exists(sourceFile)) throw new FileNotFoundException();

            using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open))
            {
                byte[] quartetBuffer = new byte[4];
                const int bufferLength = 1024 * 64;
                /*压缩文件的流的最后四个字节保存的是文件未压缩前的长度信息,
                 * 把该字节数组转换成int型,可获取文件长度。
                 * int position = (int)sourceStream.Length - 4;
                sourceStream.Position = position;
                sourceStream.Read(quartetBuffer, 0, 4);
                sourceStream.Position = 0;
                int checkLength = BitConverter.ToInt32(quartetBuffer, 0);*/

                byte[] buffer = new byte[1024 * 64];
                using (GZipStream decompressedStream = new GZipStream(sourceStream, CompressionMode.Decompress, true))
                {
                    using (FileStream destinationStream = new FileStream(destinationFile, FileMode.Create))
                    {
                        int bytesRead = 0;
                        while ((bytesRead = decompressedStream.Read(buffer, 0, bufferLength)) >= bufferLength)
                        {
                            destinationStream.Write(buffer, 0, bufferLength);
                        }
                        destinationStream.Write(buffer, 0, bytesRead);
                        destinationStream.Flush();
                    }
                }
            }
        }
        #endregion


        #region ------------------------------------------------------------------5、压缩一个文件为一个流
        /// <summary>
        /// 把一个文件压缩为一个流
        /// </summary>
        /// <param name="sourceFile">源文件的全部名称(路径+文件名)</param>
        /// <returns>压缩后的流</returns>
        public static Stream CompressStream(string sourceFile)
        {
            if (!File.Exists(sourceFile)) throw new FileNotFoundException();
            using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open))
            {
                GZipStream decompressedStream = new GZipStream(sourceStream, CompressionMode.Compress, true);
                return decompressedStream;
            }
        }
        #endregion

        #region ------------------------------------------------------------------6、压缩一个流
        /// <summary>
        /// 对一个流进行压缩
        /// </summary>
        /// <param name="sourceStream">源流</param>
        /// <returns>压缩后的流</returns>
        public static Stream CompressStream(Stream sourceStream)
        {
            GZipStream decompressedStream = new GZipStream(sourceStream, CompressionMode.Compress, true);
            return decompressedStream;
        }
        #endregion

        #region ------------------------------------------------------------------7、解压一个流
        /// <summary>
        /// 对一个流进行解压
        /// </summary>
        /// <param name="sourceStream">源流</param>
        /// <returns>解压后的流</returns>
        public static Stream DeCompressStream(Stream sourceStream)
        {
            GZipStream decompressedStream = new GZipStream(sourceStream, CompressionMode.Decompress, true);
            return decompressedStream;
        }
        #endregion

    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值