.Net项目中常用到压缩解压是最常见不过的,虽然在N<wbr>E<wbr>T<wbr><wbr>F<wbr>r<wbr>a<wbr>m<wbr>e<wbr>w<wbr>o<wbr>r<wbr>k<wbr><wbr>2<wbr>.<wbr>0<wbr><wbr>中<wbr>新<wbr>增<wbr>的<wbr>两<wbr>个<wbr>压<wbr>缩<wbr>类,但对于初次使用和项目的紧急性我们没有必要自己在写压缩和解压类。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
今天笔者在codeplex发现DotNetZip(http://dotnetzip.codeplex.com/),它是一个Zip操作类库,非常小,但也非常容易上手和使用,简短精悍的几行代码便可实现我们的需求。
例如:
//注意设置编码,默认中文件名会乱码
using (ZipFile zip = new ZipFile(@"E:\test.zip", System.Text.Encoding.Default))
{
//添加要压缩的文件夹
zip.AddDirectory(@"E:\test");
//还可以再追加单个文件
zip.AddFile(@"E:\test.doc");
//当添加文件夹或文件不存在抛错FileNotFoundException
zip.Save();
}
将要压缩文件以文件流的方式输出给客户端,不在服务端保留压缩包
using (ZipFile zip = new ZipFile())
{
//设置压缩密码,经测试设要设置置密码必须第一步设置,再添加文件或者文件夹后设置无效
zip.Password = "MyTest";
//要压缩的文件夹
zip.AddDirectory(Request.PhysicalApplicationPath);
//还可以再追加多个要压缩的文件夹或文件
//zip.AddFile(@"c:\1.txt");
//zip.AddDirectory(@"d:\MyProject\");
MemoryStream ms = new MemoryStream();
zip.Save(ms);
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.zip", DateTime.Now.ToString("yyyyMMddhhmmss")));
Response.BinaryWrite(ms.ToArray());
ms.Close();
ms.Dispose();
}
列出zip文件中所有的文件
using (ZipFile zip = ZipFile.Read(@"E:\test.zip", System.Text.Encoding.Default))
{
string list = string.Empty;
//遍历压缩包
foreach (ZipEntry entry in zip)
{
//叠加文件名
list += string.Format("{0}<br/>", entry.FileName);
}
Response.Write(list);
}
删除zip中一个文件,注意无法直接删除一个文件夹
using (ZipFile zip = ZipFile.Read(@"E:\Mytest.zip", System.Text.Encoding.Default))
{
zip.RemoveEntry("2010年全国高考语文答案.doc");
zip.Save();
}
zip中解压某文件
using (ZipFile zip = ZipFile.Read(@"E:\test.zip", System.Text.Encoding.Default))
{
//将test压缩包中的2011090810192322.doc文件解压在E盘下
zip["2011090810192322.doc"].Extract(@"E:\", true);
}
解压zip中全部文件
using (ZipFile zip = ZipFile.Read(@"E:\Mytest.zip", System.Text.Encoding.Default))
{
//遍历压缩包中的每个文件
foreach (ZipEntry entry in zip)
{
entry.Extract(@"E:\new", true);
}
}
感谢大家的阅读,欢迎指出、更正本文的不足之处,也同时感谢大家和我一起讨论和学习。