您的位置:首页 > 编程语言 > C#

C#压缩与解压缩流类 GZipStream 的使用

2012-06-04 11:43 465 查看
在使用 GZipStream 进行压缩的时候, 在最后必须调用 Close()方法, 否则会发现解压缩后少一个字节, 当压缩的文件小于4kb时, 解压缩到文件长度为0.

下面为一个完整的压缩与解压缩文件的代码, 以做参考:

private void button1_Click(object sender, EventArgs e)
{
string fileName = textBox1.Text; // @"f:\response.txt";

FileInfo fi = new FileInfo(fileName);
listBox1.Items.Add("source file length: " + fi.Length.ToString());
byte[] buf = Compress(fileName);

listBox1.Items.Add(String.Format("compress length: {0}, compress rate: {1:f2}%" ,buf.Length, (double)buf.Length * 100 / (double)fi.Length));

string newFileName = String.Format(@"{0}\{1}_new{2}",
Path.GetDirectoryName(fileName), Path.GetFileNameWithoutExtension(fileName), Path.GetExtension(fileName));
listBox1.Items.Add("decompress length: " + Decompress(buf, newFileName).ToString());
}

public static byte[] Compress(string fileName)
{
//压缩后的MemoryStream
MemoryStream ms = new MemoryStream();
// 写入压缩
GZipStream compressedStream = new GZipStream(ms, CompressionMode.Compress, true);
FileStream fs = new FileStream(fileName, FileMode.Open);
byte[] buf = new byte[1024];
int count = 0;
do
{
count = fs.Read(buf, 0, buf.Length);
compressedStream.Write(buf, 0, count);
}
while (count > 0);

fs.Close();
compressedStream.Close();

return ms.ToArray();
}

public static int Decompress(byte[] data, string fileName)
{
int iRet = 0;
byte[] buf = new byte[1024 * 1024];
try
{
FileStream fs = new FileStream(fileName, FileMode.Create);

MemoryStream ms = new MemoryStream(data);
GZipStream decompressedStream = new GZipStream(ms, CompressionMode.Decompress,true);

int count = 0;
do
{
count = decompressedStream.Read(buf, 0, buf.Length);
fs.Write(buf, 0, count);
fs.Flush();
}
while (count > 0);

iRet = (int)fs.Length;
fs.Close();
}
finally
{

}
return iRet;
}

private void button3_Click(object sender, EventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog()
{
InitialDirectory = Environment.CurrentDirectory,
Multiselect = false,
};
if (dialog.ShowDialog() == DialogResult.OK)
{
textBox1.Text = dialog.FileName;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: