zoukankan      html  css  js  c++  java
  • C#实现加压解压(v2.1)

    在前一版本的基础上改进了一些地方
    把压缩文件名加进压缩后的文件中,解压还原成原文件而不是无尾文件

    如果这个版本代码难解,可以先看看上一版本

    界面:


    代码清单:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.IO.Compression;

    namespace zipTest
    {
        
    public partial class Form1 : Form
        {
            
    public Form1()
            {
                InitializeComponent();
            }
            
    /*取消*/
            
    private void button4_Click(object sender, EventArgs e)
            {
                
    this.Close();
            }
            
    /*确定*/
            
    private void button3_Click(object sender, EventArgs e)
            {
                
    bool success = false//默认失败
                string err = "";
                
    try
                {
                    
    if (r_compress.Checked == true)
                    {
                        success 
    = GzipCompress(t_source.Text, t_dis.Text);
                    }
                    
    if (r_deCompress.Checked == true)
                    {
                        success 
    = GzipDecompress(t_source.Text, t_dis.Text);
                    }
                }
                
    catch (Exception ex)
                {
                    err
    =ex.Message.ToString();
                }
                
    if (success == false)
                    MessageBox.Show(
    "操作失败!" + err);
                
    else
                    MessageBox.Show(
    "操作成功!");
            }
            
    /*选择源文件*/
            
    private void button1_Click(object sender, EventArgs e)
            {
                
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    t_source.Text 
    = openFileDialog1.FileName;
                }
            }
            
    /*选择目标路径*/
            
    private void button2_Click(object sender, EventArgs e)
            {
                
    if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
                {
                    t_dis.Text 
    = folderBrowserDialog1.SelectedPath;
                }
            }
            
    /*加压*/
            
    public bool GzipCompress(string sourceFile,string disPath)
            {
                
    //路径合法性检测
                if (!File.Exists(sourceFile))
                    
    throw new FileNotFoundException();
                
    if (!Directory.Exists(disPath))
                    
    throw new DirectoryNotFoundException();
                
    if (!disPath.EndsWith("\\"))
                    disPath 
    += "\\";
                
    //生成压缩后文件名
                string oldName = Path.GetFileNameWithoutExtension(sourceFile);
                
    string newName = oldName + "压缩文件.gzip";
                
    bool result = true;//默认成功
                FileStream fs1 = null;
                FileStream fs2 
    = null;
                GZipStream zips 
    =null;
                
    try
                {
                    fs1 
    = new FileStream(sourceFile, FileMode.Open, FileAccess.Read);
                    fs2 
    = new FileStream(disPath + newName, FileMode.OpenOrCreate, FileAccess.Write);
                    zips 
    = new GZipStream(fs2, CompressionMode.Compress);
                    
    byte[] tempb = new byte[fs1.Length];
                    fs1.Read(tempb, 
    0, (int)fs1.Length);
                    
    //将加压前文件名保存到加压前的数组中
                    
    //第一个字节保存文件名的长度,
                    byte[] exb = System.Text.Encoding.Unicode.GetBytes(Path.GetFileName(sourceFile));
                    
    byte[] lastb = new byte[fs1.Length + exb.Length+1];
                    lastb[
    0= Convert.ToByte(exb.Length);
                    exb.CopyTo(lastb, 
    1);
                    tempb.CopyTo(lastb, exb.Length
    +1);
                    
    //压缩文件
                    zips.Write(lastb, 0, lastb.Length);
                }
                
    catch(Exception ex)
                {
                    result
    =false//执行失败
                    throw ex;
                }
                
    finally
                {
                    
    if (zips != null)
                        zips.Close();
                    
    if (fs1 != null)
                        fs1.Close();
                    
    if (fs2 != null)
                        fs2.Close();
                }
                
    return result;
            }
            
    /*解压*/
            
    public bool GzipDecompress(string sourceFile,string disPath)
            {
                
    //路径合法性检测
                if (!File.Exists(sourceFile))
                    
    throw new FileNotFoundException();
                
    if (!Directory.Exists(disPath))
                    
    throw new DirectoryNotFoundException();
                
    if (!disPath.EndsWith("\\"))
                    disPath 
    += "\\";
               
                
    bool result = true;//默认成功
                FileStream fs1 = null;
                FileStream fs2 
    = null;
                MemoryStream ms 
    = null;
                GZipStream zips 
    = null;
                
    try
                {
                    fs1 
    = new FileStream(sourceFile, FileMode.Open, FileAccess.Read);
                    ms 
    = new MemoryStream();
                    zips 
    = new GZipStream(fs1, CompressionMode.Decompress);
                    
    byte[] tempb = new byte[100];
                    
    int size = 0;
                    
    while (true)
                    {
                        size 
    = zips.Read(tempb, 0100);
                        
    if (size > 0)
                            ms.Write(tempb, 
    0, size);
                        
    else
                            
    break;
                    }
                    
    byte[] resultb = new byte[ms.Length];
                    
    //分析出加压前的文件名exName
                    ms.Position = 0;
                    ms.Read(resultb, 
    0, (int)ms.Length);
                    
    int exlen=Convert.ToInt16(resultb[0]);
                    
    string exName = System.Text.Encoding.Unicode.GetString(resultb,1,exlen);
                    
    string outFile = disPath + exName;
                    fs2 
    = new FileStream(outFile, FileMode.OpenOrCreate, FileAccess.Write);
                    fs2.Write(resultb, exlen 
    + 1, resultb.Length - exlen - 1);
                }
                
    catch(Exception ex)
                {
                    result 
    = false//执行失败
                    throw ex;
                }
                
    finally
                {
                    
    if (zips != null)
                        zips.Close();
                    
    if (fs1 != null)
                        fs1.Close();
                    
    if (fs2 != null)
                        fs2.Close();
                    
    if (ms != null)
                        ms.Close();
                }
                
    return result;
            }
        }
    }

     
  • 相关阅读:
    ATM代码及遇到的问题总结
    暑假日报-52
    暑假日报-51
    暑假日报-50
    暑假日报-49
    暑假日报-48
    线段树优化建图(炸弹 + 选课)
    联考day2 C. 舟游
    联赛模拟测试5题解
    第19周作业
  • 原文地址:https://www.cnblogs.com/wubin264/p/1275025.html
Copyright © 2011-2022 走看看