天天看點

壓縮文本、位元組或者檔案的壓縮輔助類-GZipHelper 歡迎收藏

壓縮文本、位元組或者檔案的壓縮輔助類-GZipHelper 歡迎收藏

BaseStream       擷取對基礎流的引用。 

CanRead        擷取一個值,該值訓示流是否支援在解壓縮檔案的過程中讀取檔案。 (重寫 Stream..::.CanRead。) 

CanSeek        擷取一個值,該值訓示流是否支援查找。 (重寫 Stream..::.CanSeek。) 

CanTimeout       擷取一個值,該值确定目前流是否可以逾時。 (繼承自 Stream。) 

CanWrite         擷取一個值,該值訓示流是否支援寫入。 (重寫 Stream..::.CanWrite。) 

Length          不支援,并且總是引發 NotSupportedException。 (重寫 Stream..::.Length。) 

Position         不支援,并且總是引發 NotSupportedException。 (重寫 Stream..::.Position。) 

ReadTimeout       擷取或設定一個值(以毫秒為機關),該值确定流在逾時前嘗試讀取多長時間。 (繼承自 Stream。) 

WriteTimeout      擷取或設定一個值(以毫秒為機關),該值确定流在逾時前嘗試寫入多長時間。 (繼承自 Stream。)

BeginRead         開始異步讀操作。 (重寫 Stream..::.BeginRead(array<Byte>[]()[], Int32, Int32, AsyncCallback, Object)。) 

BeginWrite        開始異步寫操作。 (重寫 Stream..::.BeginWrite(array<Byte>[]()[], Int32, Int32, AsyncCallback, Object)。) 

Close           關閉目前流并釋放與之關聯的所有資源(如套接字和檔案句柄)。 (繼承自 Stream。) 

CreateObjRef       建立一個對象,該對象包含生成用于與遠端對象進行通信的代理所需的全部相關資訊。 (繼承自 MarshalByRefObject。) 

Dispose           已重載。 

EndRead           等待挂起的異步讀取完成。 (重寫 Stream..::.EndRead(IAsyncResult)。) 

EndWrite          處理異步寫入的結束。 (重寫 Stream..::.EndWrite(IAsyncResult)。) 

Flush            将目前 GZipStream 對象的内部緩沖區的内容重新整理到基礎流。 (重寫 Stream..::.Flush()()()。) 

GetHashCode        用作特定類型的哈希函數。 (繼承自 Object。) 

GetLifetimeService     檢索控制此執行個體的生存期政策的目前生存期服務對象。 (繼承自 MarshalByRefObject。) 

InitializeLifetimeService  擷取控制此執行個體的生存期政策的生存期服務對象。 (繼承自 MarshalByRefObject。) 

MemberwiseClone      已重載。 

Read             将若幹解壓縮的位元組讀入指定的位元組數組。 (重寫 Stream..::.Read(array<Byte>[]()[], Int32, Int32)。) 

ReadByte          從流中讀取一個位元組,并将流内的位置向前推進一個位元組,或者如果已到達流的末尾,則傳回 -1。 (繼承自 Stream。) 

Seek             此屬性不受支援,并且總是引發 NotSupportedException。 (重寫 Stream..::.Seek(Int64, SeekOrigin)。) 

SetLength         此屬性不受支援,并且總是引發 NotSupportedException。 (重寫 Stream..::.SetLength(Int64)。) 

Write            從指定的位元組數組中将壓縮的位元組寫入基礎流。 (重寫 Stream..::.Write(array<Byte>[]()[], Int32, Int32)。) 

WriteByte         将一個位元組寫入流内的目前位置,并将流内的位置向前推進一個位元組。 (繼承自 Stream。) 

使用原生的方法進行壓縮解壓檔案執行個體代碼:

/// <summary>  

 /// 壓縮檔案  

 /// </summary>  

 /// <param name="fileName">檔案名(全路徑)</param>  

 /// <param name="data">需要壓縮的字元串</param>  

 public void CompressFile(string fileName, string data)  

 {         

     FileStream fstream = new FileStream(fileName, FileMode.Create, FileAccess.Write);  

     GZipStream gstream = new GZipStream(fstream, CompressionMode.Compress);  

     StreamWriter swriter = new StreamWriter(gstream);  

     swriter.Write(data);  

     swriter.Close();  

     gstream.Close();  

     fstream.Close();  

 }  

 /// <summary>  

 /// 解壓縮  

 /// <returns></returns>  

 public string DecompressFile(string fileName)  

 {  

     string cstring="";  

     FileStream fstream = new FileStream(fileName, FileMode.Open, FileAccess.Read);  

     GZipStream gstream = new GZipStream(fstream, CompressionMode.Decompress);  

     StreamReader reader = new StreamReader(gstream);  

     cstring=reader.ReadToEnd();  

     reader.Close();  

     return cstring;  

GZipHelper公共類就是以GZipStream類為基礎做的對常用解壓縮進行的封裝。GZipHelper類圖如下所示:

壓縮文本、位元組或者檔案的壓縮輔助類-GZipHelper 歡迎收藏

 GZipHelper公共類完整源碼:

using System;  

using System.IO;  

using System.IO.Compression;  

using System.Text;  

namespace RDIFramework.Utilities  

{  

    /// <summary>  

    /// 壓縮文本、位元組或者檔案的壓縮輔助類  

    /// </summary>  

    public class GZipHelper  

    {  

        /// <summary>  

        /// 壓縮字元串  

        /// </summary>  

        /// <param name="text"></param>  

        /// <returns></returns>  

        public static string Compress(string text)  

        {  

            // convert text to bytes  

            byte[] buffer = Encoding.UTF8.GetBytes(text);  

            // get a stream  

            MemoryStream ms = new MemoryStream();  

            // get ready to zip up our stream  

            using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))  

            {  

                // compress the data into our buffer  

                zip.Write(buffer, 0, buffer.Length);  

            }  

            // reset our position in compressed stream to the start  

            ms.Position = 0;  

            // get the compressed data  

            byte[] compressed = ms.ToArray();  

            ms.Read(compressed, 0, compressed.Length);  

            // prepare final data with header that indicates length  

            byte[] gzBuffer = new byte[compressed.Length + 4];  

            //copy compressed data 4 bytes from start of final header  

            System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);  

            // copy header to first 4 bytes  

            System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);  

            // convert back to string and return  

            return Convert.ToBase64String(gzBuffer);  

        }  

        /// 解壓字元串  

        /// <param name="compressedText"></param>  

        public static string Uncompress(string compressedText)  

            // get string as bytes  

            byte[] gzBuffer = Convert.FromBase64String(compressedText);  

            // prepare stream to do uncompression  

            // get the length of compressed data  

            int msgLength = BitConverter.ToInt32(gzBuffer, 0);  

            // uncompress everything besides the header  

            ms.Write(gzBuffer, 4, gzBuffer.Length - 4);  

            // prepare final buffer for just uncompressed data  

            byte[] buffer = new byte[msgLength];  

            // reset our position in stream since we're starting over  

            // unzip the data through stream  

            GZipStream zip = new GZipStream(ms, CompressionMode.Decompress);  

            // do the unzip  

            zip.Read(buffer, 0, buffer.Length);  

            return Encoding.UTF8.GetString(buffer);  

        public static T GZip<T>(Stream stream, CompressionMode mode) where T : Stream  

            byte[] writeData = new byte[4096];  

            T ms = default(T);  

            using (Stream sg = new GZipStream(stream, mode))  

                while (true)  

                {  

                    Array.Clear(writeData, 0, writeData.Length);  

                    int size = sg.Read(writeData, 0, writeData.Length);  

                    if (size > 0)  

                    {  

                        ms.Write(writeData, 0, size);  

                    }  

                    else  

                        break;  

                }  

                return ms;  

        /// 壓縮位元組  

        /// <param name="bytData"></param>  

        public static byte[] Compress(byte[] bytData)  

            using (MemoryStream stream = GZip<MemoryStream>(new MemoryStream(bytData), CompressionMode.Compress))  

                return stream.ToArray();  

        /// 解壓位元組  

        public static byte[] Decompress(byte[] bytData)  

            using (MemoryStream stream = GZip<MemoryStream>(new MemoryStream(bytData), CompressionMode.Decompress))  

        /// 壓縮檔案  

        /// <param name="sourceFile">源檔案</param>  

        /// <param name="destinationFile">目标檔案</param>  

        public static void CompressFile(string sourceFile, string destinationFile)  

            if (File.Exists(sourceFile) == false) //判斷檔案是否存在  

                throw new FileNotFoundException();  

            if (File.Exists(destinationFile) == false) //判斷目标檔案檔案是否存在  

                FileHelper.FileDel(destinationFile);  

            //建立檔案流和位元組數組  

            byte[] buffer = null;  

            FileStream sourceStream = null;  

            FileStream destinationStream = null;  

            GZipStream compressedStream = null;  

            try  

                sourceStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read);  

                buffer = new byte[sourceStream.Length];  

                //把檔案流存放到位元組數組中  

                int checkCounter = sourceStream.Read(buffer, 0, buffer.Length);  

                if (checkCounter != buffer.Length)  

                    throw new ApplicationException();  

                destinationStream = new FileStream(destinationFile, FileMode.OpenOrCreate, FileAccess.Write);  

                //建立GzipStream執行個體,寫入壓縮的檔案流  

                compressedStream = new GZipStream(destinationStream, CompressionMode.Compress, true);  

                compressedStream.Write(buffer, 0, buffer.Length);  

            finally  

                // Make sure we allways close all streams  

                if (sourceStream != null)  

                { sourceStream.Close(); }  

                if (compressedStream != null)  

                { compressedStream.Close(); }  

                if (destinationStream != null)  

                { destinationStream.Close(); }  

        /// 解壓檔案  

        public static void DecompressFile(string sourceFile, string destinationFile)  

            if (!File.Exists(sourceFile))  

            FileStream stream = null;  

            FileStream stream2 = null;  

            GZipStream stream3 = null;  

                stream = new FileStream(sourceFile, FileMode.Open);  

                stream3 = new GZipStream(stream, CompressionMode.Decompress, true);  

                buffer = new byte[4];  

                int num = ((int)stream.Length) - 4;  

                stream.Position = num;  

                stream.Read(buffer, 0, 4);  

                stream.Position = 0L;  

                byte[] buffer2 = new byte[BitConverter.ToInt32(buffer, 0) + 100];  

                int offset = 0;  

                int count = 0;  

                    int num5 = stream3.Read(buffer2, offset, 100);  

                    if (num5 == 0)  

                    offset += num5;  

                    count += num5;  

                stream2 = new FileStream(destinationFile, FileMode.Create);  

                stream2.Write(buffer2, 0, count);  

                stream2.Flush();  

                if (stream != null)  

                    stream.Close();  

                if (stream3 != null)  

                    stream3.Close();  

                if (stream2 != null)  

                    stream2.Close();  

    }  

}  

   本文轉自yonghu86 51CTO部落格,原文連結:http://blog.51cto.com/yonghu/1662008,如需轉載請自行聯系原作者

繼續閱讀