压缩和解压缩

原创 2004年08月24日 19:26:00

(SharpZipLib.dll)http://www.icsharpcode.net/

 /// <summary>
 /// 压缩文件
 /// </summary>

using System;
using System.IO;

using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;

namespace Compression
{
 public class ZipClass
 {
 
  public void ZipFile(string FileToZip, string ZipedFile ,int CompressionLevel, int BlockSize)
  {
   //如果文件没有找到,则报错
   if (! System.IO.File.Exists(FileToZip))
   {
    throw new System.IO.FileNotFoundException("The specified file " + FileToZip + " could not be found. Zipping aborderd");
   }
 
   System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip,System.IO.FileMode.Open , System.IO.FileAccess.Read);
   System.IO.FileStream ZipFile = System.IO.File.Create(ZipedFile);
   ZipOutputStream ZipStream = new ZipOutputStream(ZipFile);
   ZipEntry ZipEntry = new ZipEntry("ZippedFile");
   ZipStream.PutNextEntry(ZipEntry);
   ZipStream.SetLevel(CompressionLevel);
   byte[] buffer = new byte[BlockSize];
   System.Int32 size =StreamToZip.Read(buffer,0,buffer.Length);
   ZipStream.Write(buffer,0,size);
   try
   {
    while (size < StreamToZip.Length)
    {
     int sizeRead =StreamToZip.Read(buffer,0,buffer.Length);
     ZipStream.Write(buffer,0,sizeRead);
     size += sizeRead;
    }
   }
   catch(System.Exception ex)
   {
    throw ex;
   }
   ZipStream.Finish();
   ZipStream.Close();
   StreamToZip.Close();
  }
 
  public void ZipFileMain(string[] args)
  {
   string[] filenames = Directory.GetFiles(args[0]);
 
   Crc32 crc = new Crc32();
   ZipOutputStream s = new ZipOutputStream(File.Create(args[1]));
 
   s.SetLevel(6); // 0 - store only to 9 - means best compression
 
   foreach (string file in filenames)
   {
    //打开压缩文件
    FileStream fs = File.OpenRead(file);
  
    byte[] buffer = new byte[fs.Length];
    fs.Read(buffer, 0, buffer.Length);
    ZipEntry entry = new ZipEntry(file);
  
    entry.DateTime = DateTime.Now;
  
    // set Size and the crc, because the information
    // about the size and crc should be stored in the header
    // if it is not set it is automatically written in the footer.
    // (in this case size == crc == -1 in the header)
    // Some ZIP programs have problems with zip files that don't store
    // the size and crc in the header.
    entry.Size = fs.Length;
    fs.Close();
  
    crc.Reset();
    crc.Update(buffer);
  
    entry.Crc  = crc.Value;
  
    s.PutNextEntry(entry);
  
    s.Write(buffer, 0, buffer.Length);
  
   }
 
   s.Finish();
   s.Close();
  }
 }
}

现在再来看看解压文件类的源码

 /// <summary>
 /// 解压文件
 /// </summary>

using System;
using System.Text;
using System.Collections;
using System.IO;
using System.Diagnostics;
using System.Runtime.Serialization.Formatters.Binary;
using System.Data;

using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
using ICSharpCode.SharpZipLib.GZip;

namespace DeCompression
{
 public class UnZipClass
 {  
  public void UnZip(string[] args)
  {
   ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]));
 
   ZipEntry theEntry;
   while ((theEntry = s.GetNextEntry()) != null)
   {
  
          string directoryName = Path.GetDirectoryName(args[1]);
    string fileName      = Path.GetFileName(theEntry.Name);
  
    //生成解压目录
    Directory.CreateDirectory(directoryName);
  
    if (fileName != String.Empty)
    {  
     //解压文件到指定的目录
     FileStream streamWriter = File.Create(args[1]+theEntry.Name);
   
     int size = 2048;
     byte[] data = new byte[2048];
     while (true)
     {
      size = s.Read(data, 0, data.Length);
      if (size > 0)
      {
       streamWriter.Write(data, 0, size);
      }
      else
      {
       break;
      }
     }
   
     streamWriter.Close();
    }
   }
   s.Close();
  }
 }
}

    有了压缩和解压缩的类以后,就要在窗体里调用了。怎么?是新手,不会调用?Ok,接着往下看如何在窗体里调用。

    首先在窗体里放置两个命令按钮(不要告诉我你不会放啊~),然后编写以下源码

/// <summary>
 /// 调用源码
 /// </summary>

      private void button2_Click_1(object sender, System.EventArgs e)
  {
   string []FileProperties=new string[2];
   FileProperties[0]="C:/unzipped/";//待压缩文件目录
   FileProperties[1]="C:/zip/a.zip";  //压缩后的目标文件
   ZipClass Zc=new ZipClass();
   Zc.ZipFileMain(FileProperties);
  }

     private void button2_Click(object sender, System.EventArgs e)
  {
   string []FileProperties=new string[2];
   FileProperties[0]="C:/zip/test.zip";//待解压的文件
   FileProperties[1]="C:/unzipped/";//解压后放置的目标目录
   UnZipClass UnZc=new UnZipClass();
   UnZc.UnZip(FileProperties);
  }

笔试题-压缩与解压缩字符串

题目大致如下: 1. 请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。​压缩规则: 1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字...
  • ayw255
  • ayw255
  • 2016-10-08 16:04:13
  • 738

哈夫曼算法的压缩与解压缩

  • 2009年07月25日 13:12
  • 3KB
  • 下载

CNZip.jar用于压缩和解压缩

  • 2009年12月22日 10:05
  • 10KB
  • 下载

Java小程序之哈夫曼树与文件压缩和解压缩(三)文件解压篇

Java小程序之哈夫曼树与文件压缩和解压缩(二)文件解压篇 一、解压原理: 了解了压缩原理之后,要解压文件就是压缩文件的逆过程;拿昨天的例子来说,如果我们收到这样一串二进制1 1 01 1 1 0...
  • BlueSky_USC
  • BlueSky_USC
  • 2017-01-09 00:22:16
  • 2228

unix压缩解压缩命令详解

  • 2009年01月07日 13:21
  • 59KB
  • 下载

Huffman压缩、解压缩c语言源代码

  • 2014年02月22日 16:12
  • 6KB
  • 下载

java和C#的压缩和解压缩

由于项目需求,需要在C#中压缩,然后在java里解压缩,或者倒过来,在Java里压缩,C#里解压缩,以下代码经测试验证通过。 关键技术点和体会: 压缩的结果采用Base64编码,方便在Java端或...
  • educast
  • educast
  • 2018-01-23 15:01:33
  • 286

java String的压缩和解压缩

数据传输时,有时需要将数据压缩和解压缩,本例使用GZIPOutputStream/GZIPInputStream实现。 1、使用ISO-8859-1作为中介编码,可以保证准确还原数据 2、...
  • kouwoo
  • kouwoo
  • 2014-07-01 10:21:48
  • 565

利用哈弗曼编码实现 压缩 解压缩

利用 哈弗曼编码 实现 压缩 解压缩 c++ 实现
  • developinglife
  • developinglife
  • 2011-05-06 22:11:00
  • 2506

C语言再学习 -- linux 压缩与解压缩含义

解压缩tar  -zxvf linux-2.6.32.17.tar.gz压缩tar -zcvf   linux-2.6.32.17.tar.gz linux-2.6.32.17 分别是四个参数 z ...
  • qq_29350001
  • qq_29350001
  • 2016-02-26 10:55:58
  • 415
收藏助手
不良信息举报
您举报文章:压缩和解压缩
举报原因:
原因补充:

(最多只允许输入30个字)