使用 C# 读取 zip 压缩包解压文件的方法及注意事项

从 .NET Framework 4.5 版本开始,微软为 .NET 类库增加了一个名为 ZipFile 的类型。该类型在 System.IO.Compression 命名空间下,提供创建、解压缩和打开 zip 存档的静态方法。若要在 .NET Framework 应用中使用 ZipFile 类,必须添加对程序集 System.IO.Compression.FileSystem 的引用。

参考链接:

https://docs.microsoft.com/zh-cn/dotnet/api/system.io.compression.zipfile?view=net-6.0

使用以下代码读取压缩文件内容:

var fn = @"test.zip";
using (var zip = ZipFile.OpenRead(fn))
{foreach (var entry in zip.Entries){Console.WriteLine("文件名:{0}", entry.FullName);using (var stream = entry.Open())using (var reader = new StreamReader(stream)){var str = reader.ReadToEnd();Console.WriteLine(str);}}
}

但是,有时候上述代码会不好用。当遇到一个较大的 zip 文件时可能会报错:

Number of entries expected in End Of Central Directory does not correspond to number of entries in Central Directory.

关于该错误,只能搜索到零星的答案,而且大部分都是从国外网站机翻的没有任何参考价值。

SharpZipLib 

在 NuGet 上以 zip 为关键词搜索时,排名第二的是一个名为 SharpZipLib 的软件包。

SharpZipLib :https://www.nuget.org/packages/SharpZipLib/

示例代码:

var fn = @"test.zip";
using (var zip = new ZipFile(fn))
{foreach (ZipEntry entry in zip){Console.WriteLine("文件名:{0}", entry.Name);using (var stream = zip.GetInputStream(entry))using (var reader = new StreamReader(stream)){var str = reader.ReadToEnd();Console.WriteLine(str);break;}}
}

在遇到同样的 zip 包时,上述代码没有报错,但结果仍是错误的:ZipFile 类型有一个名为 Count 的属性,用于获取该 zip 包中的文件数量。使用一个包含 95 万个小文件的压缩包进行测试时,该属性的取值却只有 39866 ,也只能获取到 39866 个文件。这说明该组件更坑,虽然没报错但给了错误的数据:

644bbff56eb9e294c58dbc328d012eec.png
含有 95 万个文件的 zip 压缩包

DotNetZip

排名第三的软件包是:DotNetZip ,也是一个比较流行的类库。

DotNetZip : https://www.nuget.org/packages/DotNetZip/

他的用法和微软自带类库的用法相似:

var fn = @"test.zip";
using (var zip = ZipFile.Read(fn))
{foreach (var entry in zip.Entries){Console.WriteLine("文件名:{0}", entry.FileName);using (var stream = entry.OpenReader())using (var reader = new StreamReader(stream)){var str = reader.ReadToEnd();Console.WriteLine(str);}}
}

经测试,该类库在处理上文提到的文件时没有报错,且获得了正确的文件内容。唯一的遗憾是 Read 方法打开文件时耗时较长。

总结

在处理 zip 文件时,微软自带的类库能满足大多数需求。如果遇到报错的情况,在确认源文件正常的情况下可以更换其他类库读取。即使在成功读取后,也需要核对读取结果的正确性:没有报错,也不代表读取到的数据就是正确的。

附录

测试文件下载地址:

ftp://opendata:kagar1n@ftp.euipo.europa.eu/Applicant/Full/APPLICANTS_20201109_0001.zip

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CenterOS x64安装serv-U

1、下载serv-Usu - root cd / cd /src wget http://www.rhinosoft.com.cn/download/14.0.1.0/SU-MFTS-Linux-64bit.zip # 64bit下载地址wget http://www.rhinosoft.com.cn/download/14.0.1.0/SU-MFTS-Linux-32bit.zip # 32bit下载地址2、解压serv-U安装包unzip SU-MF…

Android实战:手把手实现“捧腹网”APP(二)-----捧腹APP原型设计、实现框架选取

APP原型设计在APP的开发过程中,原型设计是必不可少的。用户界面原型必须在先启阶段的初期或在精化阶段一开始建立。整个系统(包括它的“实际”用户界面)的分析、设计和实施必须在原型建立后进行。 如何设计“捧腹网”APP呢?我们先…

【前端就业课 第一阶段】HTML5 零基础到实战(七)文字及图片详解

注意:手机(APP)打开,内容显示更佳,不会的私聊博主即可 想要拿代码或加入学习计划(** 博主会监督你并且教你写文章 **)的拉到最下面(PC端Web打开)加博主即可,目…

自定义桌面右键菜单

一 编写自定义右键菜单要执行的程序 只要是在 Windows 平台上的可执行应用程序即可。 二 修改注册表添加自定义右键菜单 添加位置如下: HKEY_CLASSES_ROOT\Directory\Background\shell 如下图:转载于:https://www.cnblogs.com/jRoger/articles/5799664.h…

【ArcGIS遇上Python】ArcGIS python计算长时间序列多个栅格数据的平均值

通常,我们需要将多个栅格求平均,例如,将一年中每个月的NDVI值加起来除以12,就会等到月均NDVI,该过程虽然在栅格计算器中可以实现,但是当时间序列较长时就比较费事,此时,python代码是…

统信 Deepin为什么要摆脱Ubuntu和Debian?

文 | 大东出品 | OSC开源社区(ID:oschina2013)Deepin 出走 Debian 。近日,统信软件宣布旗下 Linux 社区发行版 Deepin 将脱离上游 Debian,从 Linux Kernel 开始构建的新闻在社区引发了热议。其实早在 7 年前&#xff0…

解决笔记本重装问题(VISTA系统改为XP系统)

今天一位同事要我帮她的上网本重装一下系统,经查看发现只是开机后一个出错问题,是安装酷狗软件引起的,用360软件管家彻底删除就行了。这时,老大拿了一台笔记本过来让我帮忙装XP操作系统,嘿~这下我的桌子摆满了电脑&…

Android实战:手把手实现“捧腹网”APP(三)-----UI实现,逻辑实现

APP页面实现根据原型图,我们可以看出,UI分为两部分,底部Tab导航上方列表显示。 所以此处,我们通过 FragmentTabHostFragment,来实现底部的导航页面,通过RecyclerView来实现列表页面。 因为篇幅原因&#xf…

【前端就业课 第一阶段】HTML5 零基础到实战(八)表单详解

注意:手机(APP)打开,内容显示更佳,不会的私聊博主即可 想要拿代码或加入学习计划(** 博主会监督你并且教你写文章 **)的拉到最下面(PC端Web打开)加博主即可,目…

【ArcGIS遇上Python】ArcGIS10.6 python批量将栅格中的特定值替换Setnull为NoData

案例一: 如下图所示为兰州市dem,将图一中高程大于1600m的像元值设置为无效(Setnull)之后的效果如图二所示。 实现过程: 栅格计算器参考文章:《【ArcGIS风暴】ArcGIS 10.2栅格计算器实用公式大全(经典珍藏版)》,该文章中主要以ArcGIS102.为平台讲解栅格计算器的…

开源力量:微软竟开源 PowerShell

导读曾经有段时间,微软称 Linux 是“癌症”,但是随着时光流逝,现在微软已经认识到了开源世界的不断增长,除了在这个领域加大投入之外别无选择。微软已经启动了几个开源项目,希望能吸引一些 Linux 用户,其中…

ENVI5.4完美实现MODIS NDVI数据格式转换和投影变换

如上图所示,分别为: View1:MODIS hdf数据多波段 View2:MODIS NDVI波段 View3:ArcGIS10.8投影变换后的MODIS NDVI View4:ENVI5.4投影变换后的MODIS NDVI 关于ArcGIS处理MODIS数据的操作,可以参照: 《ArcGIS10.8完美实现MODIS NDVI数据格式转换和投影变换》 《重磅!ArcG…

【前端就业课 第一阶段】HTML5 零基础到实战(九)列表

注意:手机(APP)打开,内容显示更佳,不会的私聊博主即可 想要拿代码或加入学习计划(** 博主会监督你并且教你写文章 **)的拉到最下面(PC端Web打开)加博主即可,目…

android 电源管理 wakelock 唤醒锁机制

Android 电源管理 — 唤醒锁全新上市 大多数人可能都遭遇过手机的电池续航时间较短带来的尴尬。 这极其令人讨厌。 没电的手机和一块水泥砖没什么差别。 一般而言,如果用户的手机电池无法持续一整天,他们会感到非常不满。而且,当手机充电时用…

初始Bootstrap

使用示例①下载Bootstrap框架 网址:http://v3.bootcss.com/getting-started/#download②解压得到三个文件③将文件添加进项目后,在页面中引用必要的css和js④查看效果(a标签美化得不要不要的了~)更多学习Bootstrap的资…

APP无埋点流程

最近无埋点技术很是流行,抽空研究了下诸葛IO,talkingData以及百分点这些业内知名公司的无埋点SDK,抽取其中重要的信息供大家参考:1、首先什么是无埋点呢,其实所谓无埋点就是开发者无需再对追踪点进行埋码,而…

Esri Maps For Office制作漂亮的地图

ArcGISOnline是一个基于云架构的资源中心,在这里你可以发布自己的地图资源、浏览其它ArcGIS爱好者发布的应用程序;总之,它为我们提供了一个在线交流的场所。 EsriMapsForOffice是ArcGISonline推出的一个Office环境的插件,可以让我们在Excel、Powerpoint中进行制图,就像在…

《什么是 eBPF》O'Reilly 报告中文版放送

祝大家端午安康,国泰民安,世界和平。今年端午节,鄙人人在北京,所在区有中风险地区,而老家又是所在省的唯一一个中风险地区,既出不了京,也回不了家。可谓有家不能回,真是每逢佳节倍思…

一键将Python2代码自动转化为Python3

Python2的代码直接在Python3环境运行的话会报错误: 如果大量的代码,无论是批量替换,还是逐行修改都够累的,这活儿表示不能干!!! 有没有办法一键转换呢? 百度了一下发现网上的方法如…

【前端就业课 第一阶段】HTML5 零基础到实战(十)JavaScript基础一篇入门

注意:手机(APP)打开,内容显示更佳,不会的私聊博主即可 想要拿代码或加入学习计划(** 博主会监督你并且教你写文章 **)的拉到最下面(PC端Web打开)加博主即可,目…