C#通过SharpZipLib库创建压缩文件-伟德国际韦德1946_

在程序中对文件进行紧缩解紧缩是很重要的功用,不只能减小文件的体积,还能对文件起到维护效果。假如是生成用户能够下载的文件,还能够极大的削减网络流量并提高下载速度。最近在一个 C# 项目顶用到了创立紧缩文件的功用,在此和同学们共享一下运用心得。

SharpZipLib 库

已然是很重要的用能,那么假如每个人在运用的时分都去用根本的细菌性阴炎怎样彻底治愈 API 去完结一遍明显不符合功率至上的出产要求。何新作为比较有经历的开发人员信任您必定会在榜首时间去搜索一款功用丰厚,口碑杰出的开源类库来完结相关的作业。在 .NET 渠道上,要操作紧缩文件的话您的榜首挑选必定是 SharpZipLib。SharpZipLib 是一个开源的根据 .NET 渠道的紧缩、解紧缩类库。特点是经过吉尼斯世界纪录长时间的开发和运用现在现已变得十分的安稳,能够定心的运用到产品中。下面咱们就经过实例来介绍怎样运用它在 C# 代码中创立紧缩文件,以及一些常见问题的处理办法。SharpZipLib 的下载请拜访这儿。编译也很简略,用 VisualStudio 翻开直接编译就能成功。假如您想全面的把握 SharpZipLib 的运用办法,建议您直接去读 SharpZipLib 的文档,本文仅介绍根本的用法和一些运用心得。

根本紧缩操作

SharpZipLib 支撑 Zip,Gzip,Tar,BZip2 等干流的紧缩格局。本文以 zip 格局做介绍,其它格局的用法也都差不太多。关于 格瓦拉zip 紧缩格局,创立紧缩文件时用到的类型首要为 ZipOutputStream 和 ZipEntry。下面经过几个典型的用例来介绍它们的用法。

读取硬盘上的文件并参加紧缩包

这或许是最简略也最常见的用法了,直接上代码:

//生成的紧缩文件为test.zip
using (FileStream fsOut = File.Create("test.zip"))
{
//ZipOutputStream类的结构C#经过SharpZipLib库创立紧缩文件-伟德世界韦德1946_函数需求一个流,文件流、内存流都能够,紧缩后的内容会写入到这个流中。
using (ZipOutputStream zipStream = new ZipOutputStream(fsOut))
{
//预备把G盘根目录下的vcredist_x86.exe文件增加到紧缩包中。
string fileN国税ame = @"G:\vcredist_x86.exe";
FileInfo fi = new FileInfo(fileName);
//entryName便是紧缩包中文件的称号。
string entryName = "vcredist_x86.exe";
//ZipEntry类代表了一个紧缩包中的一个项,能够是一个文件,也能够是一个目录。
ZipEntry newEntry = new ZipEntry(entryName);
newEntry.DateTime = fi.LastWriteTime;
newEntry.Size = fi.Length;
//把紧缩项的信息增加到ZipOutputStream中。
zipStream.PutNextEntry(newEntry);
byte[] buffer = new byte[4096];
//把需求紧缩文件以文件流的办法复制到ZipOutputStream中。
using (FileStream streamReader = File.OpenRead(fileName))
{
StreamUtC#经过SharpZipLib库创立紧缩文件-伟德世界韦德1946_ils.Copy(streamReader, zipStream, buffer);
}
zipStream.CloseEntry();
//增加多个文件
//假如要紧缩一个文件夹,便是经过遍历增加文件夹下一切的文件
string fileName2 = @"G:\share\web.dll";
FileInfo fi2 = new FileInfo(fileName2);
//文件在紧缩包中的途径
string entryName2 = "share\\web.dll";
ZipEntry newEntry2 = new ZipEntry(entryName2);
newEntry2.DateTime = fi2.LastWriteTime;
newEntry2.Size = fi2.Length;
zipStream.PutNextEntry(newEntry2);
byte[] buffer2 = new byte[4096];
using (FileStream streamReader = File.OpenRead(fileName2))
{
Strea潜泳教育视频mUtils.Copy(streamReader, zipStream, buffer2);
}
zipStream.CloseEntry();
//运用流操作时必定要设置IsStreamOwner为false。不然很简单发生在文件流封闭后的反常。
zipStream.IsStreamOwner = false;
zipStream.Finish();
zipStrea儿童动画片m.Close();
}
}

代码并不杂乱且增加了具体的注释,因而不再赘言。此刻现已完结了把C#经过SharpZipLib库创立紧缩文件-伟德世界韦德1946_文件参加紧缩包的功用,紧缩包中的内容如下:

留意,web.dll 文件在 share 文件夹中。

把内存中的数据增加到紧缩包

有时咱们要紧缩的目标并不是磁盘上的文件,而是内存中的数据。比方数据库查询操作的成果中有一些字符串,期望把这些字符串写入到紧缩包中的文本文件中。当然能够先把这些字符串保存到磁盘上的文件中,然后再经过前面比方中的办法写入紧缩包,这也能够完结使命,却不是高效的办法。首要磁盘 IO 很慢也很贵重,另外在一些 web 运用环境中你是没有权限写文件的。这就要求咱们直接把数据写入到紧缩包中:

//咱们有一个字符串,香芋期望直接写入到压三d缩包中的City.csv文件中。
byte[] string1 = Encoding.UTF8.GetBytes("Washington,ShangHai,TianJin,DongJing");
using (FileStream fsOut = File.Create("姐妹3test1.zip"))
{
using (ZipOutputStream zipStream = new ZipOutputStream(fsOu华擎t))
{
ZipEntry entry = new ZipEntry("City.csv");
entry.DateTime = DateTime.Now;
zipStream.PutNextEntry(entry);
//W长单词恐惧症rite办法和前面用的StreamUtils.Copy办法差不多,不过这儿操作的是byte数组。
zipStream.Write(string1, 0, string1.Length);
zipStream.CloseEntry();
zipStream.IsStreamOwner = false;
zipStream.Finish();
zipStream.Close();
}
}

这次咱们把内存中的一个字符串直接写入了紧缩包中得 City.csv 文件。看上去还不错,至少代码看上去还算清新。接下来看看咱们还能干些什么?

把紧缩包保存在内存边旭霞中

上面的比方中咱们说到,有时是没有权限写文件的,那还怎样创立紧缩文件呀?太对立了!其完结实中还真有这样的用例。比方你有一个网站,当用户点击下载按钮时,你需求把数据保存到紧缩文件中然后回来给用户。整个过程中你是写不了文件的,只能经过操作内存来完结:

byte[] string1 = Encoding.UTF8.GetBytes("Washington,ShangHai,TianJin,DongJing");
byte[] result = null;
using (MemoryStream ms = new MemoryStream())
{
using (ZipOutputStream zipStream = new ZipOutputStream(ms))
{
ZipEntry entry = new ZipEntry("City.csv");
entry.DateTime = DateTime.Now;
zipStream.PutNextEntry(entry);
zipStream.Write(string1, 0, string1.Length);
zipStream.CloseEntry();
zipStream.IsStreamOwner = false;
zipStream.Finish();
zipStream.ClC#经过SharpZipLib库创立紧缩文件-伟德世界韦德1946_ose();
ms.Position = 0;
//紧缩后的数据被保存到了byte[]数组中。
result = ms.ToArray();
}
}

现在 byte 数组 result 中便是紧缩包的数据。假如期望经过 HttpResponse 回来给用户,就能够经过调用 HttpResponse 的 BinaryWrite 办法完结,只要把 result 作为参数即可。

中文文件名的问题

在愉快的完结了创立紧缩文件的使命后该翻开紧缩包看看咱们生成的文件了!咱们把前面的比方略微改动一下:

byte[] string1 = Encoding.C#经过SharpZipLib库创立紧缩文件-伟德世界韦德1946_UTF8.GetBytes("Washington,ShangHai,TianJin,DongJing");C#经过SharpZipLib库创立紧缩文件-伟德世界韦德1946_
using (FileStream fsOut = File.Create("test1.zip"))
{
using (ZipOutputStream zipStream官员不雅观 = new ZipOutputStream(fsOut))
{
//文件名变成了中文
ZipEntry entry = new ZipEntry("城市.csv");
entry.DateTime = DateTime.Now;
...
}
}

运转上面代码生成 test1.zip,在资源管理器中翻开 test1.zip。What?哪里出错了?为什么紧缩包中什么都没有!

其实这是一个很典型的问题,当然也很简单处理!出问题的原因是因为我的操作系统是英文版的,而且我没有告知 ZipEntry 怎样处理中文文件名”城市.c高速铁路sv”。原因找到C#经过SharpZipLib库创立紧缩文件-伟德世界韦德1946_了,那咱们就明明白白的告知 ZipEntry 怎样处理文本:

entry.IsUnicodeText = true;

再试一次,城市 .csv 文件总算出现在了紧缩包中。好了,已然搞定了中文文件名,那么日张家界三日游文米其林餐厅文件名呀,xxx 文文件名呀都不在话下了…

总结

文件的紧缩与解紧缩自身是件比较杂乱的工作,假如咱们重复造轮子,或许完结这个功用的作业量会超越咱们项目自身(笔者本次完结的仅仅一个很小的项目)。经过运用 SharpZipLib 类库,笔者不只愉快的完结了使命,还不必忧虑紧缩文件的完结有bug(假如有也是SharpZipLib背锅啊)。言归正传,咱们经过几个典型的用例介绍了运用 C# 和 SharpZipLib 创立紧缩文件的首要办法。而且分闫怀礼享了常见的文件名问佳人沟一窝驴题的处理办法,期望对朋友们有所协助。

评论(0)