最近项目需要用到压缩,以前1.1的时候都用的第3方库,这次想尝试一下2.0带的 Compression库。
一用发现这个库压的东西偏大,而且没文件名没时间。
那么到底是为什么会这样呢,难道是我的使用有问题?
决定要搞搞明白,于是有了下面这段代码,用SharpZipLib和2.0自带的库做下对比,大家都采用Gzip压缩
使用2.0的库做压缩
使用SharpZipLib压缩
ok,之后看看我们的测试文件 1.pdf 3358kb
使用System.IO.Compression
testzip 1.pdf 0.zip 0
使用ICSharpCode.SharpZipLib.GZip
testzip 1.pdf 1.zip 1
压缩后大小:
0.zip 2499kb(System)
1.zip 1612kb(SharpZipLib)
可以看到 ICSharpCode.SharpZipLib.GZip 压缩后1612kb,C# System.IO.Compression.GZipStream 压缩后大小2499kb
而且System.IO.Compression.GZipStream压缩的文件没文件名,时间也是不对的
那么是什么原因呢?
那就让我们跟踪看看
System.IO.Compression.GZipStream的实现
GZipStream类
一用发现这个库压的东西偏大,而且没文件名没时间。
那么到底是为什么会这样呢,难道是我的使用有问题?
决定要搞搞明白,于是有了下面这段代码,用SharpZipLib和2.0自带的库做下对比,大家都采用Gzip压缩
使用2.0的库做压缩
static
MemoryStream Deflate(
byte
[] data)
... {
MemoryStream memoryStream = new MemoryStream();
using (GZipStream gzip = new GZipStream(memoryStream, CompressionMode.Compress, true))
...{
gzip.Write(data, 0, data.Length);
gzip.Flush();
gzip.Close();
}
return memoryStream;
}
... {
MemoryStream memoryStream = new MemoryStream();
using (GZipStream gzip = new GZipStream(memoryStream, CompressionMode.Compress, true))
...{
gzip.Write(data, 0, data.Length);
gzip.Flush();
gzip.Close();
}
return memoryStream;
}
使用SharpZipLib压缩
static
MemoryStream DeflateUseSharpZipLib(
byte
[] data)
... {
MemoryStream memoryStream = new MemoryStream();
using (GZipOutputStream outStream = new GZipOutputStream(memoryStream))
...{
outStream.IsStreamOwner = false;
outStream.Write(data, 0, data.Length);
outStream.Flush();
outStream.Finish();
}
return memoryStream;
}
... {
MemoryStream memoryStream = new MemoryStream();
using (GZipOutputStream outStream = new GZipOutputStream(memoryStream))
...{
outStream.IsStreamOwner = false;
outStream.Write(data, 0, data.Length);
outStream.Flush();
outStream.Finish();
}
return memoryStream;
}
ok,之后看看我们的测试文件 1.pdf 3358kb
使用System.IO.Compression
testzip 1.pdf 0.zip 0
使用ICSharpCode.SharpZipLib.GZip
testzip 1.pdf 1.zip 1
压缩后大小:
0.zip 2499kb(System)
1.zip 1612kb(SharpZipLib)
可以看到 ICSharpCode.SharpZipLib.GZip 压缩后1612kb,C# System.IO.Compression.GZipStream 压缩后大小2499kb
而且System.IO.Compression.GZipStream压缩的文件没文件名,时间也是不对的
那么是什么原因呢?
那就让我们跟踪看看
System.IO.Compression.GZipStream的实现
GZipStream类
public
override
void
Write(
byte
[] array,
int
offset,
int
count)
... {
if (this.deflateStream == null)
...{
throw new ObjectDisposedException(null, SR.GetString("ObjectDisposed_StreamClosed"));
}
this.deflateStream.Write(array, offset, count);
... {
if (this.deflateStream == null)
...{
throw new ObjectDisposedException(null, SR.GetString("ObjectDisposed_StreamClosed"));
}
this.deflateStream.Write(array, offset, count);