从 .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` 对象。