版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yeluo_vinager/article/details/79812834
GZipStream 类
提供用于压缩和解压缩流的方法和属性。创建压缩流实例有个参数枚举CompressionMode,它有两个值分别是Compress、DeCompress。表示压缩和解压。
压缩和解压代码
//实例化FileStream对象infile
FileStream infile = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.Read);
byte[] buffer = new byte[infile.Length];
//是否可读
int count = infile.Read(buffer, 0, buffer.Length);
if (count != buffer.Length) {
infile.Close();
Console.WriteLine("Test Failed: Unable to read data from file");
return;
}
infile.Close();
MemoryStream ms = new MemoryStream();
GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Compress, true);
compressedzipStream.Write(buffer, 0, buffer.Length);
compressedzipStream.Close();
//解压
ms.Position = 0;
GZipStream zipStream = new GZipStream(ms, CompressionMode.Decompress);
byte[] decompressedBuffer = new byte[buffer.Length + 100];
int offset = 0;
while (true) {
int bytesRead = zipStream.Read(decompressedBuffer, offset, 100);
if (bytesRead == 0) {
break;
}
offset += bytesRead;
}
这些是在内存处理,同样可以写入硬盘中
public static void GZipCompress(string filepath, string gzipfilepath)
{
using (FileStream fsRead = File.OpenRead(filepath)) {
using (FileStream fsWrite = File.OpenWrite(gzipfilepath)) {
using (GZipStream zipStream = new GZipStream(fsWrite, CompressionMode.Compress)) {
byte[] byts = new byte[1024];
int len = 0;
while ((len = fsRead.Read(byts, 0, byts.Length)) > 0) {
zipStream.Write(byts, 0, len);
}
fsRead.Close();
zipStream.Close();
}
}
}
}
public static void GZipDecompress(string filepath, string gzipfilepath)
{
using (FileStream fsRead = File.OpenRead(gzipfilepath)) {
using (GZipStream zip = new GZipStream(fsRead, CompressionMode.Decompress)) {
using (FileStream fsWrite = File.OpenWrite(filepath)) {
byte[] byts = new byte[1024];
int len = 0;
while ((len = zip.Read(byts, 0, byts.Length)) > 0) {
Console.WriteLine(Encoding.UTF8.GetString(byts.Take(len).ToArray()));
fsWrite.Write(byts, 0, len);
fsWrite.Flush();
}
fsWrite.Close();
}
}
}
}
注:此类不能用于压缩大于 4 GB 的文件。当从 GZipStream 继承时,必须重写下列成员:CanSeek、CanWrite 和 CanRead。