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
                            
                        庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
                        雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。
                        
                    
 
                        
                                如果感觉对您有帮助
                                欢迎向作者提供捐赠
                                这将是创作的最大动力