百度空间 | 百度首页 
 
查看文章
 
用ICSharpCode.SharpZipLib.Zip实现下载整个文件目录(小文件推荐)
2007-09-21 17:49

using ICSharpCode.SharpZipLib.Zip;
using System.IO;

public partial class Default2 : System.Web.UI.Page
{
     ZipOutputStream zos = null;
     String strBaseDir = "";

     protected void Page_Load(object sender, EventArgs e)
     {
         dlZipDir(Server.MapPath("test"), "test");
         //网站根目录建立一个test文件夹,里面随便放几个文件进去,子文件夹也行
     }

     protected void dlZipDir(string strPath, string strFileName)
     {
         MemoryStream ms = null;
         Response.ContentType = "application/octet-stream";
         strFileName = HttpUtility.UrlEncode(strFileName).Replace('+', ' ');
         Response.AddHeader("Content-Disposition", "attachment; filename=" + strFileName + ".zip");
         ms = new MemoryStream();
         zos = new ZipOutputStream(ms);
         strBaseDir = strPath + "\\";
         addZipEntry(strBaseDir);
         zos.Finish();
         zos.Close();
         Response.Clear();
         Response.BinaryWrite(ms.ToArray());
         Response.End();
     }

     protected void addZipEntry(string PathStr)
     {
         DirectoryInfo di = new DirectoryInfo(PathStr);
         foreach (DirectoryInfo item in di.GetDirectories())
         {
             addZipEntry(item.FullName);
         }
         foreach (FileInfo item in di.GetFiles())
         {
             FileStream fs = File.OpenRead(item.FullName);
             byte[] buffer = new byte[fs.Length];
             fs.Read(buffer, 0, buffer.Length);
             string strEntryName = item.FullName.Replace(strBaseDir, "");
             ZipEntry entry = new ZipEntry(strEntryName);
             zos.PutNextEntry(entry);
             zos.Write(buffer, 0, buffer.Length);
             fs.Close();
         }
     }
}

用递归的方式,调用addZipEntry遍历目标文件夹中所有的文件或子文件夹,将压缩数据暂时放入MemoryStream内存流中,然后用Response.BinaryWrite输出到页面

缺点就是,目标文件有多大,占用内存就有多大,因为压缩生成的数据都是暂存在内存中的,所以,大文件就惨死,我曾经尝试过两个人同时下载一个100M左右的文件夹,服务器内存马上从500M彪升到已使用900M以上。或许可以改进一下,比如压缩流不要放入内存,而是生成临时文件,下载完成再删除掉,可能会快点


类别:编程技术 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu