用ASP.Net实现文件的在线压缩和解压缩

  我们经常会遇到批量上传的问题,也会遇到将某个目录下所有文件都上传到服务器上的问题。那么,如何解决此类问题呢?以前的技术一般采用ActiveX等方式,这里笔者采用SharpZlib来实现,听说VS2005已有压缩和解压缩的解决方案,笔者还没有时间用VS2005,所以就只好使用VS2003 + SharpZlib来解决问题了。

  1、首先从这里下载0.84版本的SharpZlib源码及示例码。
  2、下载下来之后你发现它没有VS2003的解决方案文件,没有关系。你可以自己建立,首先新建一个ZipUnzip的解决方案,然后,将上面经过解压缩之后的所有文件及目录COPY到你的解决方案所在的目录下。
  3、在VS2003解决方案资源管理器(一般是在右上方中部点的位置)中点击显示所有文件按钮,然后可以见到很多“虚”的图标、文件及文件夹等,可以一次选择它们,然后包含进项目中。
  4、编译,最好使用Release选项,编译完成之后你可以在\bin\Release\看到ZipUnzip.dll的类了。如果你编译时报错,说什么AssemblyKeyFile之类的,你可以使用强命名工具新建一个,也可以将AssemblyInfo.cs中[assembly: AssemblyKeyFile("。。。。。")]改成:[assembly: AssemblyKeyFile("")]  (不推荐这样做)。
  5、新建一个WEBFORM项目,添加ZipUnzip.dll类的引用,然后添加如下文件及内容:

// ------------------------------------------
// 1. AttachmentUnZip.cs
// ------------------------------------------
using System;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;

namespace WebZipUnzip
{
 public class AttachmentUnZip
 {
  public AttachmentUnZip()
  {  
  }
  public static void UpZip(string zipFile)
  {
   string []FileProperties=new string[2];
   FileProperties[0]=zipFile;//待解压的文件
   FileProperties[1]=zipFile.Substring(0,zipFile.LastIndexOf("\\")+1);//解压后放置的目标目录
   UnZipClass UnZc=new UnZipClass();
   UnZc.UnZip(FileProperties);
  }
 }
}

// ---------------------------------------------
// 2. UnZipClass.cs
// ---------------------------------------------

using System;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;

namespace WebZipUnzip
{
 public class UnZipClass
 {  
  /// <summary>
  /// 解压文件
  /// </summary>
  /// <param name="args">包含要解压的文件名和要解压到的目录名数组</param>
  public void UnZip(string[] args)
  {
   ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]));
   try
   {   
    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();
   }
   catch(Exception eu)
   {
    throw eu;
   }
   finally
   {
    s.Close();
   }

}//end UnZip

public static bool UnZipFile(string file, string dir)
  {
   try
   {
    if (!Directory.Exists(dir))
     Directory.CreateDirectory(dir);
    string fileFullName = Path.Combine(dir,file);
    ZipInputStream s = new ZipInputStream(File.OpenRead( fileFullName ));

ZipEntry theEntry;
    while ((theEntry = s.GetNextEntry()) != null)
    {
     string directoryName = Path.GetDirectoryName(theEntry.Name);
     string fileName = Path.GetFileName(theEntry.Name);

if (directoryName != String.Empty)
      Directory.CreateDirectory( Path.Combine(dir, directoryName));

if (fileName != String.Empty)
     {
      FileStream streamWriter = File.Create( Path.Combine(dir,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();
    return true;
   }
   catch (Exception)
   {
    throw;
   }
  }

}//end UnZipClass
}

// ----------------------------------------------
// 3. ZipClass.cs
// ----------------------------------------------
using System;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;

namespace WebZipUnzip
{
 /// <summary>
 /// 压缩文件
 /// </summary>
 public class ZipClass
 {
  public void ZipFile(string FileToZip, string ZipedFile ,int CompressionLevel, int BlockSize,string password)
  {
   //如果文件没有找到,则报错
   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]);
   string[] filenames = new string[]{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();
  }
 }
}

// ---------------------------------------------
// 4. WebForm1.aspx
// ---------------------------------------------
  <%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="WebZipUnzip.WebForm1" %> 
<META content="Microsoft Visual Studio .NET 7.1" name=GENERATOR>
<META content=C# name=CODE_LANGUAGE>
<META content=JavaScript name=vs_defaultClientScript>
<META content=http://schemas.microsoft.com/intellisense/ie5 name=vs_targetSchema>
<FORM id=Form1 method=post runat="server"><?xml:namespace prefix = asp /><asp:Button id=Button1 style="Z-INDEX: 101; LEFT: 56px; POSITION: absolute; TOP: 64px" runat="server" Text="压缩"></asp:Button><asp:Button id=Button2 style="Z-INDEX: 102; LEFT: 112px; POSITION: absolute; TOP: 64px" runat="server" Text="解压"></asp:Button><INPUT id=File1 style="Z-INDEX: 103; LEFT: 32px; POSITION: absolute; TOP: 24px" type=file name=File1 runat="server"> </FORM></BODY></HTML>

//-------------------------------------------
// 5.WebForm1.aspx.cs
//-------------------------------------------

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace WebZipUnzip
{
 /// <summary>
 /// Summary description for WebForm1.
 /// </summary>
 public class WebForm1 : System.Web.UI.Page
 {
  protected System.Web.UI.WebControls.Button Button1;
  protected System.Web.UI.HtmlControls.HtmlInputFile File1;
  protected System.Web.UI.WebControls.Button Button2;

private void Page_Load(object sender, System.EventArgs e)
  {
   // Put user code to initialize the page here
  }

#region Web Form Designer generated code
  override protected void OnInit(EventArgs e)
  {
   //
   // CODEGEN: This call is required by the ASP.NET Web Form Designer.
   //
   InitializeComponent();
   base.OnInit(e);
  }

/// <summary>
  /// Required method for Designer support - do not modify
  /// the contents of this method with the code editor.
  /// </summary>
  private void InitializeComponent()
  {   
   this.Button1.Click += new System.EventHandler(this.Button1_Click);
   this.Button2.Click += new System.EventHandler(this.Button2_Click);
   this.Load += new System.EventHandler(this.Page_Load);

}
  #endregion

#region 压缩
  private void Button1_Click(object sender, System.EventArgs e)
  {
   string []FileProperties=new string[2];  
   string fullName=this.File1.PostedFile.FileName;//C:\test\a.txt
   string destPath=System.IO.Path.GetDirectoryName(fullName);//C:\test
   //待压缩文件
   FileProperties[0]=fullName;

//压缩后的目标文件
   FileProperties[1]= destPath +"\\"+ System.IO.Path.GetFileNameWithoutExtension(fullName) + ".zip";
   ZipClass Zc=new ZipClass();
   Zc.ZipFileMain(FileProperties);

//删除压缩前的文件
   System.IO.File.Delete(fullName);
  }

#endregion

#region 解压
  private void Button2_Click(object sender, System.EventArgs e)
  {
   string fullName=this.File1.PostedFile.FileName;//C:\test\a.zip
   //解压文件
   //AttachmentUnZip.UpZip(fullName);

//   string[] FileProperties = new string[2];
//   FileProperties[0] = fullName;//待解压的文件
//   FileProperties[1] = System.IO.Path.GetDirectoryName(fullName);//解压后放置的目标目录
//   UnZipClass UnZc=new UnZipClass();
//   UnZc.UnZip(FileProperties);
   string dir = System.IO.Path.GetDirectoryName(fullName);
   string fileName = System.IO.Path.GetFileName(fullName);
   UnZipClass.UnZipFile(fileName, dir);
  }
  #endregion
 }
}

  OK! 试试看。

  此方案解决了文件名中文字的问题,目录解压缩问题。
  至于整个文件夹批量上传并压缩成一个WINZIP压缩包的问题,没有时间解决了,各位如有解决方案,不妨共享一下。

(0)

相关推荐

  • asp.net输出重写压缩页面文件实例代码

    例子 复制代码 代码如下: using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.htmlControls;using Sys

  • asp.net C#实现解压缩文件的方法

    本文实例讲述了asp.net C#实现解压缩文件的方法.一共给大家介绍了三段代码,一个是简单的解压缩单个zip文件,后一个可以解压批量的大量的但需要调用ICSharpCode.SharpZipLib.dll类了,最后一个比较实例可压缩也可以解压缩了分享给大家供大家参考.具体如下: 解压缩单个文件: 复制代码 代码如下: using System.IO; using System.IO.Compression; string sourceFile=@"D:2.zip"; string d

  • C#实现GZip压缩和解压缩入门实例

    主要是因为GZipStream的构造函数中第一个需要传入一个Stream,第二个是指定操作方式:压缩还是解压缩. 当时的疑问点主要有: 1.我传入的Stream是包含未压缩数据的Stream吗?2.我解压时是从一个压缩流中读取数据后再用GZipStream解压吗? 出现以上两点疑问,完全是我将GZipStream的用法理解反了. 其实GZipStream里面存的是已经压缩过的数据流,传入的Stream是作为基础Stream传入,如果要压缩,那你就可以传一个空的Stream进去,如果要解压,就将包

  • asp.net中调用winrar实现压缩解压缩的代码

    asp.net压缩文件夹调用示例:rar("e:/www.jb51.net/", "e:/www.jb51.net.rar"); asp.net解压缩rar文件调用示例:unrar("e:/www.jb51.net.rar", "e:/"); 复制代码 代码如下: using System; using System.Collections.Generic; using System.Text; using System.Di

  • asp.net SharpZipLib的压缩与解压问题

    我使用SharpZipLib.dll中遇到的问题是:利用SharpZipLib压缩后生成的*.rar文件,利用其可以正常解压,但如果使用文件右击压缩生成的*.RAR文件,在解压过程中出错,具体报错信息:Wrong Local header signature: 0x21726152 ;但*.zip文件可正常解压. 具体压缩.解压代码实现参照网络上的代码,贴出概要代码: 复制代码 代码如下: /// <summary> /// 压缩文件 /// </summary> /// <

  • c#调用winrar解压缩文件代码分享

    复制代码 代码如下: using Microsoft.Win32;using System.Diagnostics;压缩string the_rar;RegistryKey the_Reg;object the_Obj;string the_Info;ProcessStartInfo the_StartInfo;Process the_Process;try{the_Reg = Registry.ClassesRoot.OpenSubKey(@"Applications\WinRAR.exe\S

  • ASP.NET页面进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)第1/2页

    在介绍之前,先简单说一说ASP.NET服务端GZIP压缩模块的作用及工作原理,很多人编写网页的时候页面因为使用了大量的JS特效又或者放置很多大型动态广告导致了页面或脚本体积庞大,通常都会使用一些压缩工具本地对页面或脚本进行一定的压缩后再上传到服务器,但这样的压缩工具一般压缩率有限,优化自然也不明显,本文章介绍的压缩模块的作用就是对asp.net的页面或脚本等资源进行高强度GZIP压缩(一般能压缩到只有1/5的体积),而且压缩的过程是发生在客户端请求aspx页面的时候由服务端进行压缩处理后再传送给

  • Asp.net在线备份、压缩和修复Access数据库示例代码

    1.问题的提出 在设计中小型Web应用程序时,可以选择Microsoft Accesss为数据库.在数据库的使用过程中经常性进行增加和删除操作.事实上,Microsoft Access并不能有效地释放已分配的但被删除的对象空间,这将意味着即使你删除了一个对象,而这个对象仍然占据着数据库的空间,使得数据库越来越大.不但占用不必要的空间,而且降低了数据库的效率.特别在虚拟站点上的问题尤为突出.因此对Access数据库进行压缩瘦身很有实际意义. 虽然Access数据库自身具有"压缩和修复数据库&quo

  • 基于Asp.Net MVC4 Bundle捆绑压缩技术的介绍

    很高兴,最近项目用到了Asp.Net MVC4 + Entity Framework5,发现mvc4加入了Bundle.Web API等技术,着实让我兴奋,以前是用第三方的,这里主要说说Bundle技术. 很多大网站都没有用Bundle技术造成很多资源浪费与性能的牺牲,别小瞧 用上了你会发现他的好处: 将多个请求捆绑为一个请求,减少服务器请求数 没有使用Bundle技术,debug下看到的是实际的请求数与路径 使用Bundle技术,并且拥有缓存功能调试设置为Release模式并按F5或修改web

  • C#使用iCSharpcode进行文件压缩实现方法

    本文所述为一个C#使用iCSharpcode压缩的使用类,经测试效果不错.分享给大家供大家参考之用.具体方法如下: 1.参数类 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ZipCompress { public class ZipParameter { private string zip_Name = ""; private strin

  • asp.net 图片超过指定大小后等比例压缩图片的方法

    复制代码 代码如下: /// <summary>        /// 压缩图片        /// </summary>        /// <returns></returns>        public string ResizePic()        {            #region 压缩图片开始            bool IsImgFile = true;  //判断是否为图片文件            string file

随机推荐