C# 壓縮文件
System.IO.Compression 命名空間
注意:此命名空間在 .NET Framework 2.0 版中是新增的。
System.IO.Compression 命名空間包含提供基本的流壓縮和解壓縮服務(wù)的類。
(downmoon原作)
類 說(shuō)明
DeflateStream 提供用于使用 Deflate 算法壓縮和解壓縮流的方法和屬性。
GZipStream 提供用于壓縮和解壓縮流的方法和屬性。
枚舉 說(shuō)明
CompressionMode 指定是否壓縮或解壓縮基礎(chǔ)流。
下面以 GZipStream 為例說(shuō)明
注意:此類在 .NET Framework 2.0 版中是新增的。
提供用于壓縮和解壓縮流的方法和屬性。
命名空間:System.IO.Compression
程序集:System(在 system.dll 中)
語(yǔ)法
Visual Basic(聲明)
Public Class GZipStream
Inherits Stream
Visual Basic(用法)
Dim instance As GZipStream
C#
public class GZipStream : Stream
C++
public ref class GZipStream : public Stream
J#
public class GZipStream extends Stream
JScript
public class GZipStream extends Stream
備注
此類表示 GZip 數(shù)據(jù)格式,它使用無(wú)損壓縮和解壓縮文件的行業(yè)標(biāo)準(zhǔn)算法。這種格式包括一個(gè)檢測(cè)數(shù)據(jù)損壞的循環(huán)冗余校驗(yàn)值。GZip 數(shù)據(jù)格式使用的算法與 DeflateStream 類的算法相同,但它可以擴(kuò)展以使用其他壓縮格式。這種格式可以通過(guò)不涉及專利使用權(quán)的方式輕松實(shí)現(xiàn)。gzip 的格式可以從 RFC 1952“GZIP file format specification 4.3(GZIP 文件格式規(guī)范 4.3)GZIP file format specification 4.3(GZIP 文件格式規(guī)范 4.3)”中獲得。此類不能用于壓縮大于 4 GB 的文件。
給繼承者的說(shuō)明 當(dāng)從 GZipStream 繼承時(shí),必須重寫(xiě)下列成員:CanSeek、CanWrite 和 CanRead。
下面提供 一個(gè)完整的壓縮與解壓類(downmoon原作 ):
{
public void CompressFile ( string sourceFile, string destinationFile )
{
// make sure the source file is there
if ( File.Exists ( sourceFile ) == false )
throw new FileNotFoundException ( );
// Create the streams and byte arrays needed
byte[] buffer = null;
FileStream sourceStream = null;
FileStream destinationStream = null;
GZipStream compressedStream = null;
try
{
// Read the bytes from the source file into a byte array
sourceStream = new FileStream ( sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read );
// Read the source stream values into the buffer
buffer = new byte[sourceStream.Length];
int checkCounter = sourceStream.Read ( buffer, 0, buffer.Length );
if ( checkCounter != buffer.Length )
{
throw new ApplicationException ( );
}
// Open the FileStream to write to
destinationStream = new FileStream ( destinationFile, FileMode.OpenOrCreate, FileAccess.Write );
// Create a compression stream pointing to the destiantion stream
compressedStream = new GZipStream ( destinationStream, CompressionMode.Compress, true );
// Now write the compressed data to the destination file
compressedStream.Write ( buffer, 0, buffer.Length );
}
catch ( ApplicationException ex )
{
MessageBox.Show ( ex.Message, "壓縮文件時(shí)發(fā)生錯(cuò)誤:", MessageBoxButtons.OK, MessageBoxIcon.Error );
}
finally
{
// Make sure we allways close all streams
if ( sourceStream != null )
sourceStream.Close ( );
if ( compressedStream != null )
compressedStream.Close ( );
if ( destinationStream != null )
destinationStream.Close ( );
}
}
public void DecompressFile ( string sourceFile, string destinationFile )
{
// make sure the source file is there
if ( File.Exists ( sourceFile ) == false )
throw new FileNotFoundException ( );
// Create the streams and byte arrays needed
FileStream sourceStream = null;
FileStream destinationStream = null;
GZipStream decompressedStream = null;
byte[] quartetBuffer = null;
try
{
// Read in the compressed source stream
sourceStream = new FileStream ( sourceFile, FileMode.Open );
// Create a compression stream pointing to the destiantion stream
decompressedStream = new GZipStream ( sourceStream, CompressionMode.Decompress, true );
// Read the footer to determine the length of the destiantion file
quartetBuffer = new byte[4];
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[checkLength + 100];
int offset = 0;
int total = 0;
// Read the compressed data into the buffer
while ( true )
{
int bytesRead = decompressedStream.Read ( buffer, offset, 100 );
if ( bytesRead == 0 )
break;
offset += bytesRead;
total += bytesRead;
}
// Now write everything to the destination file
destinationStream = new FileStream ( destinationFile, FileMode.Create );
destinationStream.Write ( buffer, 0, total );
// and flush everyhting to clean out the buffer
destinationStream.Flush ( );
}
catch ( ApplicationException ex )
{
MessageBox.Show(ex.Message, "解壓文件時(shí)發(fā)生錯(cuò)誤:", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
// Make sure we allways close all streams
if ( sourceStream != null )
sourceStream.Close ( );
if ( decompressedStream != null )
decompressedStream.Close ( );
if ( destinationStream != null )
destinationStream.Close ( );
}
}
}