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;
        }
    }
}

 
posted @ 2008-08-24 10:23  refuly  阅读(310)  评论(0编辑  收藏  举报