壓縮文本、位元組或者檔案的壓縮輔助類-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公共類完整源碼:
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,如需轉載請自行聯系原作者