C#壓縮與解壓縮流類 GZipStream 的使用


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM