在.Net中使用ZIP格式文件

2022-04-01  乐帮网

zip netcore

Zip 文件是计算历史上最普遍的压缩格式,它由 Phillip Katz 于 1986 年首次发明。 从那时起,Zip 文件作为事实上的压缩方法进入了每个操作系统。 .NET 开发人员应该掌握该格式下的编程工作。
在这篇文章中,我们将了解 ZipFile 实用程序类,如何压缩文件和目录,以及解压缩 zip 文件

使用 ZipFile System.IO.Compression
Microsoft 在 .NET Framework 4.5 中引入了 ZipFile 类,开发人员可以在 .NET 5、.NET Core 1.0+、UWP 和 Xamarin.Forms 目标上使用该实用程序类。 ZipFile 静态类依赖于对文件系统的访问; 因此,任何希望使用此类的应用程序也需要引用 System.IO.Compression.FileSystem 程序集。

创建 Zip 文件示例

ZipFile 类有一个 CreateFromDirectory 方法,该方法采用目标目录和生成的 zip 文件的目标路径。

using System;
using System.IO;
using System.IO.Compression;

// using a target directory
// ZipFile will create
// the zip file on disk
ZipFile.CreateFromDirectory(
    @"./",
    @"./archive.zip"
);

使用 CreateFromDirectory 方法,我们可以设置几个变量,包括压缩级别为 Fastest、Optimal 和 NoCompression。 通过查看代码,默认压缩似乎是最佳的,当然我们可以提供参数进行设置。

using System;
using System.IO;
using System.IO.Compression;

ZipFile.CreateFromDirectory(
    @"./", 
     "archive.zip", 
    compressionLevel: CompressionLevel.Fastest, 
    includeBaseDirectory: false, 
    entryNameEncoding: Encoding.UTF8);

如果想要更多压缩目录,可以循环浏览目录的内容并单独添加文件。 当只想添加特定文件(图像或视频文件)时,可以使用以下代码。 注意: Zip Archive 上调用 Dispose 以确保创建有效的 zip 文件非常重要。 在下面的示例中,我们使用 using 关键字声明了一个作用域变量。
 

using System;
using System.IO;
using System.IO.Compression;

var images = Directory.GetFiles(@"./", "*.png");

if (File.Exists("archive.zip"))
    File.Delete("archive.zip");

using var archive = 
    ZipFile
    .Open(@"archive.zip", ZipArchiveMode.Create);

foreach (var image in images)
{
    var entry =
        archive.CreateEntryFromFile(
            image,
            Path.GetFileName(image),
            CompressionLevel.Optimal
        );
    
    Console.WriteLine($"{entry.FullName} was compressed.");
}

如果我们需要使用仅存在于内存中的实体,我们可以使用 Stream 对象。 我们可以使用大多数流上的 CopyToAsync 方法直接复制到我们的 ZipEntry 实例中。

using System;
using System.IO;
using System.IO.Compression;

var images = Directory.GetFiles(@"./", "*.png");
if (File.Exists("archive.zip"))
    File.Delete("archive.zip");
using var archive =
    ZipFile
        .Open(@"archive.zip", ZipArchiveMode.Create);

// we're getting a file stream
// here but it could be any stream
var file = File.OpenRead(images[0]);
var entry =
    archive.CreateEntry(
        "test.png",
        CompressionLevel.Optimal
    );
await file.CopyToAsync(entry.Open());
Console.WriteLine($"{entry.FullName} was compressed.");

这些是在 C# 应用程序中创建 zip 文件的几种方法,但是从 zip 文件中搜索文件呢?

解压缩 Zip 文件示例

最直接的方法是使用 ZipFile 类中的 ExtractToDirectory 方法。 此方法会将条目写入磁盘上的目录,然后我们可以使用我们的文件系统访问该目录。 

using System;
using System.IO;
using System.IO.Compression;

ZipFile.ExtractToDirectory(
    @"./archive.zip",
    @"./destination_directory",
    overwriteFiles: true
);

如果我们需要对 zip 文件条目进行处理,我们可以使用 ZipFile 上的 OpenFile 方法来创建一个 Zip Archive 实例。然后通过Zip Archive 来操作这些文件项目。
 

using System;
using System.IO;
using System.IO.Compression;

var archive = ZipFile.OpenRead(@"./archive.zip");

foreach (var entry in archive.Entries)
{
    Console.WriteLine(entry.Name);
    var stream = entry.Open();
    
    // read stream
    // push to the cloud?
    // do whatever you like!
}

正如我们所见,使用现有 zip 文件及其内容的过程很简单,有了 Stream 实例的能力使我们能够将资源从 zip 文件推送到任何其他存储。

总结

Zip 文件是开发人员理解的基本文件格式。 虽然不是最有效的压缩格式,但它无处不在,并且被所有技术栈所理解。 它允许我们在单个数据流中传递逻辑分组的文件,这在许多用户场景中都很有用。 幸运的是 .NET 开发人员,ZipFile 实用程序类提供了足够多的功能来处理这种压缩方法,以及我们可以使用这种文件格式的多种方式。

如果您觉得这篇文章有帮助,请与您的朋友和同事分享。 一如既往,感谢您的阅读。

原文地址

公众号二维码

关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com

庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。

欧阳修

付款二维码

如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力