添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

从 .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 个文件。这说明该组件更坑,虽然没报错但给了错误的数据:

含有 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

从 .NET Framework 4.5 版本开始,微软为 .NET 类库增加了一个名为 ZipFile 的类型。该类型在System.IO.Compression命名空间下,提供创建、解压缩和打开 zip 存档的静态方法。若要在 .NET Framework 应用中使用 ZipFile 类,必须添加对程序集 System.IO.Compression.FileSys...
C 是一种中级编程语言,由贝尔实验室的丹尼斯·里奇 (Dennis Ritchie) 开发。C 是 B 编程语言的继承者。那为什么叫中级呢?这是因为 C 编程语言代表了高级和低级编程的组合。 C是一种通用的,程序语言,是BU一世LT在Unix系统上的开发工作。Unix 内核是通过 C 编程语言重新实现的。C 可以处理具有最少运行时支持的机器指令。这就是为什么 C 被称为系统语言的原因。它还提供对计算机内存和语言结构的手动访问。 C 可以在各种平台上使用。因...
你要明白,任何问题都不是孤立存在的,一定有人曾经遇到过,并且已经有更好的解决办法了,只是我还不知道。我不应该在黑暗中独自前行,去重新发明轮子,也许我的顿悟,只是别人的基本功!我应该要站在巨人的肩膀上,学习更成熟的经验和方法,然后再来解决这个问题 11-01 在.NET可以通过多种方式实现zip的压缩和解压:1、使用System.IO.Packaging;2、使用第三方类库;3、通过 System.IO.Compression 命名空间中新增的ZipArchive、ZipFile等类实现。… 还有一种是使用shell32,进行zip包的解压与压缩。 引用DLL C:\Windows\System3.
使用DotNetZip包进行ZIP包的压缩和解压缩,DotNetZip可以通过Nuget管理器安装 public static class CompressHelper /// <summary> /// 压缩单个文件 /// </summary> /// <param name="fileName">文件名</param> /// <param name="co
Hello,大家好,我是网呦,今天分享的内容是:C#操作文件压缩与解压(zip格式)。该文章Core Code 引用于:C#文件压缩与解压 在企业开发过程中经常会遇到文件的压缩与解压,虽然网上很多流行的压缩文件格式都是RAR的,但是由于RAR不是一个开放的标准,因此ZIP成了更多人的选择。如果你不想自己开发的话可以选择开源的项目,比如SharpZipLib就是一个不错的选择。 我在引用的程序上
今天老师又带着我们串讲了一下c的一部分东西,写这篇博客是为了总结一下今天学过的知识。       首先先说一下编程语言,编程语言经历了从低到高的发展,从机器语言到汇编语言,再到高级语言,而c就是高级语言,而在高级语言中又分为面向过程的语言和面向对象的语言,c是前者。进入c语言。 一、首先说c的数据类型 1、整型  shot(短整型,2个字节)   int(整型,4个字节)   lon
* 主题:压缩包帮助类 * Description: * 功能:【该压缩方法来自:https://www.cnblogs.com/Chary/p/No0000DF.html】 * 1、创建 zip 存档,该文档包含指定目录的文件和子目录(单个目录) * 2、创建 zip 存档,该存档包含指定目录的文件和目录(多个目录) * 3、递归删除磁盘上的指定文件夹目录及文件 * 4
为什么是C C语言中的C怎么来的? 各位,我们天天讲C语言,学C语言,那你知道C语言中的C是怎么来的吗?今天我们就给大家简单讲一下,其实这也要从C语言的发展史或者由来说起了,让我们先来看个小视频吧! 海风教育退费 海风教育在线辅导0元一对一试听课等你来领取,领取课程方法: 1、私信留下您的手机号和姓名,需要补习的科目。 2、也可以在海风教育官网留下您的手机号领取 https://www.hf...
C和C++的主要区别在于C是过程式编程语言,不支持类和对象,而C++是过程式和面向对象编程语言的结合;因此C++可以被称为混合语言。 使用VS或者g++作为编译器,.c和.cpp可以相互调用,gcc编译器不能编译.cpp中超过c语言特性的东西. 下面是使用vs作为编译器,.c和.cpp相互调用的例子. .cpp调用.c main.cpp #include <iostream> using namespace std; extern "C" int add(); int main(..
// 打开原始 zip 压缩包 using (FileStream originalFileStream = new FileStream(@"C:\example.zip", FileMode.Open)) // 创建新的 zip 压缩包,并打开 ZipWriter using (FileStream newFileStream = new FileStream(@"C:\example_modified.zip", FileMode.Create)) using (ZipArchive archive = new ZipArchive(newFileStream, ZipArchiveMode.Update)) // 遍历原始压缩包中的每个文件,并将它们加入到新的压缩包中 foreach (ZipArchiveEntry entry in new ZipArchive(originalFileStream).Entries) ZipArchiveEntry newEntry = archive.CreateEntry(entry.FullName); // 从原始压缩包中复制数据到新的压缩包中 using (Stream originalStream = entry.Open()) using (Stream newStream = newEntry.Open()) byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = originalStream.Read(buffer, 0, buffer.Length)) > 0) newStream.Write(buffer, 0, bytesRead); // 修改特定的文件 ZipArchiveEntry modifiedEntry = archive.GetEntry("example.txt"); if (modifiedEntry != null) using (StreamWriter writer = new StreamWriter(modifiedEntry.Open())) writer.Write("This file has been modified."); 注意:为了使用 `ZipArchiveMode.Update` 模式,必须使用 `FileStream` 构造函数创建 `ZipArchive` 对象,并指定文件名和模式。如果你只想读取现有的压缩包,请使用 `ZipArchive(Stream)` 构造函数并传递要读取的 `Stream` 对象。