中国站长下载-为中国站长提供最好最全的建站资源! 首 页发布资源有事留言繁體中文
设为首页
加入收藏
联系我们
 
您当前的位置:中国站长下载 -> 文章中心 -> 网页编程 -> .NET编程 -> 文章内容  虚拟主机 域名注册 退出登录 用户管理
栏目导航
· ASP编程 · .NET编程
· PHP编程 · JSP编程
· CGI 专区
热门文章
· sndvol32 - sndvol3...
· [组图] FLASH:《大话李白》...
· 个人网站到底能赚多...
· [图文] Rundll.exe是病毒吗...
· [组图] Flash:制作MV
· 价值12万元的网站SE...
· 网站创业者,你需要...
· 一个成功的网站设计...
· [图文] FLASH:韩国导航条解...
· 中国网站的赚钱模式...
相关文章
· [图文] 用ASP.NET 2.0设计网...
· [图文] 用ASP.NET 2.0设计网...
· [图文] 用ASP.NET 2.0设计网...
· [图文] 用ASP.NET 2.0设计网...
· [图文] 用ASP.NET 2.0设计网...
· 使用ASP.NET开发移动...
· 用ASP.NET开发Web服...
· [图文] 用ASP.NET在同一网页...
· 用Asp.net实现基于X...
· 用Asp.net实现基于X...
用ASP.NET实现文件的在线压缩和解压缩
作者:不详  来源:不详  发布时间:2006-8-14 8:26:52  发布人:chinazhan

 减小字体 增大字体

     我们经常会遇到批量上传的问题,也会遇到将某个目录下所有文件都上传到服务器上的问题。那么,如何解决此类问题呢?以前的技术一般采用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压缩包的问题,没有时间解决了,各位如有解决方案,不妨共享一下  做人要厚道,请注明转自chinazhan中国站长(www.ChinaZhan.com)。

 
[] [返回上一页] [打 印] [收 藏]
∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论...]
中国站长下载
中国站长下载

本页只接受PR>=4 IT类站点连接,申请连接,谢谢您们的支持!希望我们的下载站能够真正帮到中国的站长们!
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图
Copyright © 2005-2006 ChinaZhan.Net. All Rights Reserved .