使用SharpZip进行文件压缩

在网上找了下sharpzip的使用资料,根据自已实际使用整理了一下:

首先,在 http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx?下载源码,找到“ZipConstants.cs”修改

public static string ConvertToString(byte[] data)
{
return Encoding.GetEncoding("gb2312").GetString(data, 0, data.Length);
//return Encoding.ASCII.GetString(data,0, data.Length);
}

public static byte[] ConvertToArray(string str)
{
return Encoding.GetEncoding("gb2312").GetBytes(str);
//return Encoding.ASCII.GetBytes(str);
}

然后再生成DLL,就可支持中文名称了

(具体的使用方式我整理成了一个专用类,使用时直接根据需要调用相应的方式就OK了,部份代码出自网上一些朋友之手,辗转之中不知是谁原创了。)


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ICSharpCode.SharpZipLib.Zip;
using System.IO;


namespace TestQQInterface
{
    public class zip
    {
        public string ServerDir;
        public string ShortDir(string s)
        {
            //将文件的绝对路径转为相对路径
            string d = s.Replace(ServerDir, "");
            return d;
        }


        //压缩文件 p 为客户端传回来的文件列表:文件名+压缩包的名称
        public void ZipFile(string p)
        {
            string[] tmp = p.Split(new char[] { '*' });  //分离文件列表
            if (tmp[tmp.Length - 1] != "")  //压缩包名称不为空
            {
                ZipOutputStream u = new ZipOutputStream(File.Create(ServerDir + tmp[tmp.Length - 1]));            //新建压缩文件流 “ZipOutputStream”
                for (int i = 0; i < tmp.Length - 1; i++)
                {
                    if (tmp[i] != "")  //分离出来的文件名不为空
                    {
                        this.AddZipEntry(tmp[i], u, out u); //向压缩文件流加入内容
                    }
                }
                u.Finish(); // 结束压缩
                u.Close();
            }
        }


        public void ZipDir(string dir,string zipName)
        {
            ZipOutputStream u = new ZipOutputStream(File.Create(ServerDir + zipName));
            this.AddZipEntry(dir, u, out u);
            u.Finish();
            u.Close();
        }


        //添加压缩项目:p 为需压缩的文件或文件夹; u 为现有的源ZipOutputStream;  out j为已添加“ZipEntry”的“ZipOutputStream”
        public void AddZipEntry(string p, ZipOutputStream u, out ZipOutputStream j)
        {
            string s = ServerDir + p;
            if (Directory.Exists(s))  //文件夹的处理
            {
                DirectoryInfo di = new DirectoryInfo(s);


                //***********以下内容是修订后添加的***********
                if (di.GetDirectories().Length <= 0)   //没有子目录
                {
                    ZipEntry z = new ZipEntry(p + "\\"); //末尾“\\”用于文件夹的标记
                    u.PutNextEntry(z);
                }
                //***************以上内容是修订后添加的***************




                foreach (DirectoryInfo tem in di.GetDirectories())  //获取子目录
                {
                    ZipEntry z = new ZipEntry(this.ShortDir(tem.FullName) + "\\"); //末尾“\\”用于文件夹的标记
                    u.PutNextEntry(z);    //此句不可少,否则空目录不会被添加
                    s = this.ShortDir(tem.FullName);
                    this.AddZipEntry(s, u, out u);       //递归
                }
                foreach (FileInfo temp in di.GetFiles())  //获取此目录的文件
                {
                    s = this.ShortDir(temp.FullName);
                    this.AddZipEntry(s, u, out u);      //递归
                }
            }
            else if (File.Exists(s))  //文件的处理
            {
                u.SetLevel(9);      //压缩等级
                FileStream f = File.OpenRead(s);
                byte[] b = new byte[f.Length];
                f.Read(b, 0, b.Length);          //将文件流加入缓冲字节中
                ZipEntry z = new ZipEntry(this.ShortDir(s));
                u.PutNextEntry(z);             //为压缩文件流提供一个容器
                u.Write(b, 0, b.Length);  //写入字节
                f.Close();
            }
            j = u;    //返回已添加数据的“ZipOutputStream”
        }


        public void UnZipFile(string p)   //解压缩
        {
            string[] un_tmp = p.Split(new char[] { '*' });
            int i2 = 0;  //防止名称冲突的参数
            for (int j = 0; j < un_tmp.Length; j++)
            {
                if (un_tmp[j] != "")
                {
                    string un_time = System.DateTime.Now.ToShortDateString() + "-" + System.DateTime.Now.Hour.ToString() + "-" + System.DateTime.Now.Minute.ToString() + "-" + (System.DateTime.Now.Second + i2).ToString();
                    string un_dir = ServerDir + "Unzip-" + un_time;
                    Directory.CreateDirectory(un_dir);    //创建以解压时间为名称的文件夹
                    ZipInputStream f = new ZipInputStream(File.OpenRead(ServerDir + un_tmp[j])); //读取压缩文件,并用此文件流新建 “ZipInputStream”对象
                A: ZipEntry zp = f.GetNextEntry();   //获取解压文件流中的项目。 另注(我的理解):在压缩包里每个文件都以“ZipEntry”形式存在,其中包括存放文件的目录信息。如果空目录被压缩,该目录下将出现一个名称为空、大小为 0 、“Crc”属性为 00000000 的“文件”。此文件只是个标记,不会被解压。
                    while (zp != null)
                    {
                        string un_tmp2;
                        if (zp.Name.IndexOf("\\") >= 0) //获取文件的目录信息
                        {
                            int tmp1 = zp.Name.LastIndexOf("\\");
                            un_tmp2 = zp.Name.Substring(0, tmp1);
                            Directory.CreateDirectory(un_dir + "\\" + un_tmp2 + "\\"); //必须先创建目录,否则解压失败 --- (A) 关系到下面的步骤(B)
                        }
                        if (!zp.IsDirectory && zp.Crc != 00000000L) //此“ZipEntry”不是“标记文件”
                        {
                            int i = 2048;
                            byte[] b = new byte[i];  //每次缓冲 2048 字节
                            FileStream s = File.Create(un_dir + "\\" + zp.Name); //(B)-新建文件流
                            while (true) //持续读取字节,直到一个“ZipEntry”字节读完
                            {
                                i = f.Read(b, 0, b.Length); //读取“ZipEntry”中的字节
                                if (i > 0)
                                {
                                    s.Write(b, 0, i); //将字节写入新建的文件流
                                }
                                else
                                {
                                    break; //读取的字节为 0 ,跳出循环
                                }
                            }
                            s.Close();
                        }
                        goto A; //进入下一个“ZipEntry”
                    }
                    f.Close();
                    i2++;
                }
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值