C#下文件的压缩与解压

来源:互联网 发布:卫星地球软件 编辑:程序博客网 时间:2024/04/27 14:32

无论在开发.NETWindows应用程序还是ASP.NET时,时常会碰到文件的压缩与解压,虽然在MicrosoftFramework2.0 中提供了相关的类库,但是在MicrosoftFramework 1.1中,并未提供相关的类库。我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net下载了关于压缩和解压缩的源码,这里我引用ICSharpCode,可以快速达到目的!

首先需要在项目里引用SharpZipLib.dll。然后修改其中的关于压缩和解压缩的类。实现源码如下:

1.       压缩类

 

using System;

using System.IO;

 

using ICSharpCode.SharpZipLib.Checksums;

using ICSharpCode.SharpZipLib.Zip;

using ICSharpCode.SharpZipLib.GZip;

 

namespace CompressionTest

{

     /// <summary>

     /// 压缩文件

     /// </summary>

     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("指定的文件 " + FileToZip + "没有被发现!");

              }

 

              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();

         }

 

     }

}

 

2.       解压缩类

 

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 CompressionTest

{

     /// <summary>

     /// 解压文件

     /// </summary>

     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] + fileName);

                       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();

         }

     }

}

 

有了压缩和解压缩的类以后,就要在窗体里调用了。

首先在窗体里放置两个命令按钮, 然后编写以下源码:

 

 

private void btnZip_Click(object sender, System.EventArgs e)

         {

              try

              {

                   string []FileProperties=new string[2];

                   FileProperties[0]=@"C:/unzipped/"; //待压缩文件目录

                   FileProperties[1]=@"C:/zip/test.zip";  //压缩后的目标文件

                   ZipClass Zc=new ZipClass();

                   Zc.ZipFileMain(FileProperties);

                  MessageBox.Show("压缩文件成功!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);

              }

              catch(Exception ex)

              {

                   MessageBox.Show(ex.Message);

                   return;

              }

 

         }

 

private void btnUnZip_Click(object sender, System.EventArgs e)

         {

              try

              {

                   string []FileProperties=new string[2];

                   FileProperties[0]=@"C:/zip/test.zip";//待解压的文件

                   FileProperties[1]=@"C:/unzipped/";//解压后放置的目标目录

                   UnZipClass UnZc=new UnZipClass();

                   UnZc.UnZip(FileProperties);

                   MessageBox.Show("解压缩文件成功!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);

              }

              catch(Exception ex)

              {

                   MessageBox.Show(ex.Message);

                   return;

              }

 

         }

 

到此为止,如何压缩和解压缩的类都已经完成了!