在使用 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; } }