专栏首页明丰随笔浅谈.Net Framework中压缩和解压

浅谈.Net Framework中压缩和解压

1. 类层次结构

.Net Framework在下面两个类库中实现了压缩文件和解压文件的功能。

System.IO.Compression.dll
System.IO.Compression.FileStream.dll

这里列出了一系列的类支持压缩文件和提取文件等功能:

下面对这5个类的用途一一描述。

ZipFile类

一个工具类,提供创建、提取和打开zip存档的静态方法。

//根据目录创建zip存档
public static void CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName)
//根据zip存档,解压到指定文件夹
public static void ExtractToDirectory(string sourceArchiveFileName, string destinationDirectoryName)
//根据zip存档的路径,开打zip存档,并返回ZipArchive对象
public static ZipArchive Open(string archiveFileName, ZipArchiveMode mode)
public enum ZipArchiveMode
{
  Read,
  Create,
  Update
}

ZipArchive类

表示压缩文件的压缩包,采用zip存档格式。

属性:

//zip存档中所有文件信息
public ReadOnlyCollection<ZipArchiveEntry> Entries
//zip存档的打开方式
public ZipArchiveMode Mode

构造方法:

public ZipArchive(Stream stream)
public ZipArchive(Stream stream, ZipArchiveMode mode)

实例方法:

//在zip存档中新建一个文件
public ZipArchiveEntry CreateEntry(string entryName)
//在zip存档中获取一个文件
public ZipArchiveEntry GetEntry(string entryName)
//关闭zip存档对象
public void Dispose()

ZipArchiveEntry类

表示zip存档中的压缩文件。

属性:

//它属于的zip存档对象
public ZipArchive Archive
//文件数据流的长度
public long Length
//文件数据流压缩之后的长度
public long CompressedLength
//文件名称
public string Name
//文件相对于zip存档的路径
public string FullName
//文件最后的写入时间
public DateTimeOffset LastWriteTime

实例方法:

//从zip存档中删除当前的压缩文件
public void Delete()
//打开当前的压缩文件,返回流
public Stream Open()

GZipStream类

提供用于压缩和解压缩流的方法和属性。

构造方法:

public GZipStream(Stream stream, CompressionMode mode)
public enum CompressionMode
{
  Decompress,
  Compress
}

属性:

public Stream BaseStream
public override bool CanRead
public override bool CanSeek
public override bool CanWrite

实例方法:

//从缓冲区同步到设备
public override void Flush()
//读取基础流数据,然后解压,最后保存到array数组
public override int Read(byte[] array, int offset, int count)
//将字节从指定的字节数组取出,然后进行压缩,最后写入基础流。
public override void Write(byte[] array, int offset, int count)

DeflateStream类

提供使用deflate算法压缩和解压缩流的方法和属性。

构造方法:

public DeflateStream(Stream stream, CompressionMode mode)

属性:

public Stream BaseStream
public override bool CanRead
public override bool CanSeek
public override bool CanWrite

实例方法:

public override void Flush()
public override int Read(byte[] array, int offset, int count)
public override void Write(byte[] array, int offset, int count)

2. ZipFile类

ZipFile类是一个工具类,它有许多静态方法,可以帮助打开zip文件、提取数据、将目录压缩成zip文件、将zip文件提取到文件夹等等。

下面使用ZipFile类的方法将文件夹压缩到zip文件中,然后将该zip文件解压缩到其他文件夹。

代码如下:

string inputDir = @"C:\test\inputdir";
string zipPath = @"C:\test\data.zip";
string extractPath = @"C:\test\outputdir";
//将目录压缩成zip文件
ZipFile.CreateFromDirectory(inputDir, zipPath);
//将zip文件提取到文件夹
ZipFile.ExtractToDirectory(zipPath, extractPath);

运行结果:

打开data.zip如下:

3. ZipArchive类

ZipArchive对象表示以zip文件格式打包的压缩文件。可以通过ZipFile类的OpenRead方法返回ZipArchive对象。通过ZipArchive对象可以读取压缩在zip存档中的文件。

下面的示例,列出了zip存档中包含的文件。

string zipPath = "c:/test/data.zip";
using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
  // Fetch the list of ZipArchiveEntry(s).
  foreach (ZipArchiveEntry entry in archive.Entries)
  {
    Console.WriteLine("Entry:");
    //文件名
    Console.WriteLine("  Name = " + entry.Name);
    //存档中的相对路径和文件名
    Console.WriteLine("  FullName = " + entry.FullName);
  }
}

运行的结果:

提取zip存档中的文件到指定路径:

string zipPath = "c:/test/data.zip";
// Output Directory to unzip.
string extractPath = "c:/test/extract";
// if it doesn't exist, create
if (!Directory.Exists(extractPath))
{
  Directory.CreateDirectory(extractPath);
}

using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
  foreach (ZipArchiveEntry entry in archive.Entries)
  {
    Console.WriteLine("Found: " + entry.FullName);
    // Find entries ends with .docx
    if (entry.FullName.EndsWith(".docx", StringComparison.OrdinalIgnoreCase))
    {
      // ie: document/Dotnet.docx
      Console.WriteLine(" - Extract entry: " + entry.FullName);
      // C:/test/extract/documents/Dotnet.docx  ...
      string entryOuputPath = Path.Combine(extractPath, entry.FullName);
      Console.WriteLine(" - Entry Ouput Path: " + entryOuputPath);
      FileInfo fileInfo = new FileInfo(entryOuputPath);
      // Make sure the directory containing this file exists.
      // ie: C:/test/extract/documents
      fileInfo.Directory.Create();
      // Overwrite old file if it already exists.
      entry.ExtractToFile(entryOuputPath, true);
    }
  }
}

运行的结果:

还可以将文件放入可用的zip存档中。

string zipPath = "C:/test/data.zip";
// Open stream to read zip file.
using (FileStream zipStream = new FileStream(zipPath, FileMode.Open))
{
  // Create ZipArchive object.
  using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Update))
  {
    // Add entry to ZipArchive.
    ZipArchiveEntry readmeEntry = archive.CreateEntry("note/Note.txt");
    // Create stream to write content to entry.
    using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
    {
      writer.WriteLine("## Note.txt");
      writer.WriteLine("========================");
    }
  }
}

运行的结果:

回顾本文:

FCL中5个类类层次结构

这5个类的用途和成员信息

将目录压缩成zip文件

将zip文件提取到文件夹

通过ZipArchive对象读取压缩在zip存档中的文件

提取zip存档中的文件

在现有zip存档中添加新文件

-纸上得来终觉浅,绝知此事要躬行-

本文分享自微信公众号 - 明丰随笔(liumingfengwx2),作者:刘明丰

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • RPC编程

    RPC全称Remote Procedure Call,即远程方法调用。它的表现形式是:

    小蜜蜂
  • 使用.Net发电子邮件小结

    电子邮件是通过互联网发出去的,互联网中传输层协议有TCP/IP协议,邮件服务在基于TCP/IP底层协议之上的应用层实现SMTP、POP3、IMAP4等协议,通过...

    小蜜蜂
  • IOC编程

    2. 开放/封闭原则: 添加任何新行为,应该是扩展到新类中,而不应该直接修改原来运行良好的代码。

    小蜜蜂
  • python zip函数

    zip函数接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表。具体意思不好用文字来表述,直接看示例:

    py3study
  • 外部配置存储模式

    将配置信息从应用程序部署包移出,移到一个集中的位置。 这可以提供用于简化管理和控制配置数据,以及用于在应用程序和应用程序实例之间共享配置数据的机会。

    只喝牛奶的杀手
  • 30秒让图片变裸照,使用无门槛,这个软件比Deepfake杀伤力更大

    2017 年后,伪造逼真图像的 Deepfake 技术利用其将女性图片嫁接至色情图像内容引起很非议,用它恶意伪造的图像开始大规模在互联网上流传,也给人们辨别图像...

    AI科技大本营
  • Java Web前端到后台常用框架介绍

    来源: 小宝鸽 - CSDN博客 链接: http://blog.csdn.net/u013142781/article/details/50922010 一...

    顶级程序员
  • 简述URL并分别说明各部分含义

    转自:http://blog.csdn.net/dzhj11/article/details/9194999

    周俊辉
  • Restful API 的设计规范

    避免层级过深的URI /在URI中表示层级,用于按实体关联关系进行对象导航,一般跟进id导航; 过深的导航容易导致url膨胀,不易维护,如 GET /zoos/...

    Clearlove
  • 【Hello NLP】CS224n学习笔记[3]:共现矩阵、SVD与GloVe词向量

    SimpleAI 【HelloNLP】系列笔记,主要参考各知名网课(Stanford CS224n、DeepLearning.ai、李宏毅机器学习等等),并配合...

    beyondGuo

扫码关注云+社区

领取腾讯云代金券