• 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;
                }
            } 
    ~做事情贵在坚持~
  • 相关阅读:
    使用 awk 命令统计文本
    Mysql基础及系统函数(分享)
    存储过程 :字段按逗号拆分并插入到关联表
    Spring Security SavedRequestAwareAuthenticationSuccessHandler类
    自制Springboot Starter
    vue3 input中回车生成标签
    NOMURA Programming Contest 2022(AtCoder Beginner Contest 253)
    Educational Codeforces Round 129 (Rated for Div. 2)
    Panasonic Programming Contest 2022(AtCoder Beginner Contest 251)
    2022 Google Kick Start Round C
  • 原文地址:https://www.cnblogs.com/csMapx/p/2534396.html
Copyright © 2020-2023  润新知