public static byte[] Compress(byte[] src)
{
if (null == src)
{
return null;
}
using (var ms = new MemoryStream())
{
using (GZipStream gs = new GZipStream(ms, System.IO.Compression.CompressionMode.Compress))
{
gs.Write(src, 0, src.Length);
}
return ms.ToArray();
}
}
public static void Decompress(byte[] src, ref byte[] dist)
{
if (null == src || null == dist)
{
return;
}
using (var ms = new MemoryStream(src))
{
using (GZipStream gs = new GZipStream(ms, System.IO.Compression.CompressionMode.Decompress))
{
int iread = gs.Read(dist, 0, dist.Length);
}
}
}
MSDN 上提供了标准示例:
public static void Compress(DirectoryInfo directorySelected)
{
foreach (FileInfo file in directorySelected.GetFiles("*.xml"))
using (FileStream originalFileStream = file.OpenRead())
{
if ((File.GetAttributes(file.FullName) & FileAttributes.Hidden)
!= FileAttributes.Hidden & file.Extension != ".cmp")
{
using (FileStream compressedFileStream = File.Create(file.FullName + ".cmp"))
{
using (DeflateStream compressionStream = new DeflateStream(compressedFileStream, CompressionMode.Compress))
{
originalFileStream.CopyTo(compressionStream);
}
}
FileInfo info = new FileInfo(directoryPath + "\\" + file.Name + ".cmp");
Console.WriteLine("Compressed {0} from {1} to {2} bytes.", file.Name, file.Length, info.Length);
}
}
}
public static void Decompress(FileInfo fileToDecompress)
{
using (FileStream originalFileStream = fileToDecompress.OpenRead())
{
string currentFileName = fileToDecompress.FullName;
string newFileName = currentFileName.Remove(currentFileName.Length - fileToDecompress.Extension.Length);
using (FileStream decompressedFileStream = File.Create(newFileName))
{
using (DeflateStream decompressionStream = new DeflateStream(originalFileStream, CompressionMode.Decompress))
{
decompressionStream.CopyTo(decompressedFileStream);
Console.WriteLine("Decompressed: {0}", fileToDecompress.Name);
}
}
}
}
事实上使用 DeflateStream 可以达到比 GzipStream 更好的压缩效果,因为它们使用了不同的压缩算法,但是,只能处理未压缩的数据;
GzipStream 支持保存成 gz 格式的压缩文件,而 DeflateStream 不支持保存成压缩文件;