zoukankan      html  css  js  c++  java
  • 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;
                }
            } 
    ~做事情贵在坚持~
  • 相关阅读:
    【codeforces 29B】Traffic Lights
    【codeforces 131E】Yet Another Task with Queens
    Java数据结构与算法(8)
    fdisk一键操作分区-无需脚本
    【codeforces 46C】Hamsters and Tigers
    【codeforces 417D】Cunning Gena
    【codeforces 95C】Volleyball
    【codeforces 229C】Triangles
    【codeforces 234F】Fence
    【codeforces 235B】Let's Play Osu!
  • 原文地址:https://www.cnblogs.com/csMapx/p/2534396.html
Copyright © 2011-2022 走看看