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

发布时间:2016-12-10 14:51:39 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"用ASP.NET实现文件的在线压缩和解压缩",主要涉及到用ASP.NET实现文件的在线压缩和解压缩方面的内容,对于用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  {   ///   /// 解压文件   ///   /// 包含要解压的文件名和要解压到的目录名数组   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 {  ///  /// 压缩文件  ///  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.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 description for WebForm1.  ///  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);   }   ///   /// Required method for Designer support - do not modify   /// the contents of this method with the code editor.   ///   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  } }   此方案解决了文件名中文字的问题,目录解压缩问题。   至于整个文件夹批量上传并压缩成一个WINZIP压缩包的问题,没有时间解决了,各位如有解决方案,不妨共享一下。

上一篇:Silverlight实例教程 - Validation数据验证DataAnnotation机制和调试技巧
下一篇:练习

相关文章

相关评论