码迷,mamicode.com
首页 > Windows程序 > 详细

c# 压缩文件

时间:2016-04-26 14:21:26      阅读:563      评论:0      收藏:0      [点我收藏+]

标签:

需求来源:有大量存放于服务器上的文件,出于安全考虑文件名随机,但客户来下载时需要转化为有意义的名字并能够打包下载。

dll下载地址:http://icsharpcode.github.io/SharpZipLib/

本文中主要使用了ICSharpCode.SharpZipLib.Zip中的ZipFile和INameTransform。ZipFile用来生成压缩文件;INameTransform用来把格式化无序的文件名,需要注意的是其中的TransformFile接口方法会被调用两次。

public partial class XZZS_Pae : MyPage //继承于自己封装的Page类
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                if (RequestString("sfys").Equals("1"))//根据传入的参数判断是不是批量压缩下载
                {
                    GetZipFile();
                }
                else
                {
                    //单个文件下载,不再列出
                }
            }
        }
        #endregion Page_Load 页面加载

        /// <summary>
        /// 把文件进行压缩打包
        /// </summary>
        public void GetZipFile()
        {
            //获取传递进来的文件ID的列表
            string[] sid = this.RequestString("zs_id").Split(,);
            if (sid.Length < 1) return;
            
            MemoryStream ms = new MemoryStream();
            byte[] buffer = null;

            using (ZipFile zfile = ZipFile.Create(ms))
            {
                zfile.BeginUpdate();
                //通过下面的名称格式化器,可以将里面的文件名进行一些处理。
                //默认情况下,会自动根据文件的路径在zip中创建有关的文件夹。注意,是全路径。
                zfile.NameTransform = new MyNameTransfom(this.Opusr.UnitID.ToString());
                for (int izs = 0; izs < sid.Length; izs++)
                {
                    //根据文件ID从数据库中查询实体路径的SqlTy为本人封装的类,可以根据需要自己编写取得dt的代码
                    DataTable dt = SqlTy.ExecuteDatatable("select zs_lj from zs where zs_id=‘" + sid[izs] + "");
                    if (dt.Rows.Count < 1) continue;
                    //根据数据库中查询到的信息获取相对应文件的实际路径
                    string sfile = ConfigurationSettings.AppSettings["PDFFilePath"] + dt.Rows[0]["zs_lj"].ToString() + sid[izs] + ".pdf";
                    if (!File.Exists(sfile)) continue;
                    zfile.Add(sfile);
                }
                zfile.CommitUpdate();
                buffer = new byte[ms.Length];
                ms.Position = 0;
                ms.Read(buffer, 0, buffer.Length);
            }
            Response.AddHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode("全部文件.zip"));
            Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");//防止zip文件名中的中文出现乱码
            Response.BinaryWrite(buffer);
            Response.Flush();
            Response.End();
        }
        public class MyNameTransfom : ICSharpCode.SharpZipLib.Core.INameTransform
        {

            #region INameTransform 成员
            string iuser = "";//可以在此传入一些在重新生成zip中的文件名所需要的参数,可以增加多个。
            public MyNameTransfom(string iuserid)
            {
                iuser = iuserid;
            }
            public string TransformDirectory(string name)
            {
                return name;
            }
           //最简单的一行代码搞定:return Path.GetFileName(name);
            public string TransformFile(string name)
            {
                string sfilename = "";
                string zsid = Path.GetFileNameWithoutExtension(name);
                DataTable dt = SqlTy.ExecuteDatatable("select * from zs where zs_id=‘" + zsid + "");
                //一次zipfile.Add(filename)方法至少会调用本方法两次
                //第二次传入的文件名实际上是第一次被调用返回的文件名
                //所以本处做了处理,直接返回传入的文件名
                if (dt.Rows.Count < 1)
                {
                    sfilename = name;
                }
                else//下面的代码是根据用户自己设置的文件名命名规则生成新的文件名,有兴趣再看^_^否则自己重做吧
                {
                    DataTable dtfilename = SqlTy.ExecuteDatatable("select lmyw from wjmpz where yhid=‘" + iuser + "‘ order by sid");
                    if (dtfilename.Rows.Count > 0)
                    {
                        for (int i = 0; i < dtfilename.Rows.Count; i++)
                        {
                            sfilename += dt.Rows[0][dtfilename.Rows[i][0].ToString()].ToString()+"_";
                        }
                        sfilename = sfilename.TrimEnd(_);
                    }
                    else
                    {
                        sfilename = dt.Rows[0]["zs_zsh"].ToString();
                    }
                }
                sfilename += ".pdf";
                return sfilename;
            }
            #endregion
        }
    }

 

c# 压缩文件

标签:

原文地址:http://www.cnblogs.com/caids/p/5434527.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!