前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >浅谈.Net Framework中压缩和解压

浅谈.Net Framework中压缩和解压

作者头像
小蜜蜂
发布于 2019-07-23 07:30:23
发布于 2019-07-23 07:30:23
1.4K00
代码可运行
举报
文章被收录于专栏:明丰随笔明丰随笔
运行总次数:0
代码可运行

1. 类层次结构

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
System.IO.Compression.dll
System.IO.Compression.FileStream.dll

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

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

ZipFile类

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//根据目录创建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存档格式。

属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//zip存档中所有文件信息
public ReadOnlyCollection<ZipArchiveEntry> Entries
//zip存档的打开方式
public ZipArchiveMode Mode

构造方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public ZipArchive(Stream stream)
public ZipArchive(Stream stream, ZipArchiveMode mode)

实例方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//在zip存档中新建一个文件
public ZipArchiveEntry CreateEntry(string entryName)
//在zip存档中获取一个文件
public ZipArchiveEntry GetEntry(string entryName)
//关闭zip存档对象
public void Dispose()

ZipArchiveEntry类

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

属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//它属于的zip存档对象
public ZipArchive Archive
//文件数据流的长度
public long Length
//文件数据流压缩之后的长度
public long CompressedLength
//文件名称
public string Name
//文件相对于zip存档的路径
public string FullName
//文件最后的写入时间
public DateTimeOffset LastWriteTime

实例方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//从zip存档中删除当前的压缩文件
public void Delete()
//打开当前的压缩文件,返回流
public Stream Open()

GZipStream类

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

构造方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public GZipStream(Stream stream, CompressionMode mode)
public enum CompressionMode
{
  Decompress,
  Compress
}

属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public Stream BaseStream
public override bool CanRead
public override bool CanSeek
public override bool CanWrite

实例方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//从缓冲区同步到设备
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算法压缩和解压缩流的方法和属性。

构造方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public DeflateStream(Stream stream, CompressionMode mode)

属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public Stream BaseStream
public override bool CanRead
public override bool CanSeek
public override bool CanWrite

实例方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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文件解压缩到其他文件夹。

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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存档中包含的文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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存档中的文件到指定路径:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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存档中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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存档中添加新文件

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 明丰随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
基于单片机的红绿灯/交通灯系统,自定义时间调节,C编程,仿真搭建
(1)利用51单片机设计一个交通灯控制系统,来实现行人与车流的分流的目的。该系统主要应用在十字路口,纵向为主干道,横向为支干道;
蒋宇智
2024/03/27
4350
基于单片机的红绿灯/交通灯系统,自定义时间调节,C编程,仿真搭建
基于51单片机的模拟交通灯控制系统
(1)利用51单片机设计一个交通灯控制系统,来实现行人与车流的分流的目的。该系统主要应用在十字路口,纵向为主干道,横向为支干道;
芯动大师
2024/05/26
1970
基于51单片机的模拟交通灯控制系统
基于51单片机的交通灯控制系统设计开题报告_交通灯控制系统设计的毕业论文
第一章 硬件设计与原理 以AT89C51单片机为核心,起着控制作用。系统包括数码管显示电路、复位电路、时钟电路、发光二级管电路和按键电路。设计思路分为六个模块:复位电路、晶振电路模块、AT89C51、数码管显示电路、发光二级管电路和按键电路这六个模块。
全栈程序员站长
2022/11/08
1.2K0
基于51单片机的交通灯控制系统设计开题报告_交通灯控制系统设计的毕业论文
C51单片机–定时器实验
这个代码感觉逻辑上没问题,实际仿真出来倒计时的1s感觉要比实际的慢,可能是由于单片机执行语句时也需要耗费时间
全栈程序员站长
2022/09/13
8080
C51单片机–定时器实验
红绿灯程序是怎么实现的?
摘要:本文设计了一种基于AT89C51单片机芯片的交通信号灯控制系统该系统除具有交通灯控制功能外,增加了现场实时控制及交通信号灯故障检测功能,提高了交通灯的智能化、可靠性和实用性,可有效提高交叉口的车辆通行能力。 如今,红绿灯安装在各个路口,成为疏导交通车辆最常见和最有效的手段。这一技术但是,随着社会的不断进步,传统的交通灯的缺陷也日益出现,其设计过于死板,红绿灯交替变换时间过于程式化,达不到道路的最大通行效率是最明显的问题。 文中研究的是以AT89C52单片机为控制器的交通灯控制系统,该系统通过红外接收器
程序员互动联盟
2018/03/15
2.5K0
红绿灯程序是怎么实现的?
基于单片机的智能交通灯控制系统的设计实验_单片机控制系统红绿灯设计
基于单片机的智能交通灯控制系统的设计-硬件开发文档类资源-CSDN下载内容包括详细设计文档word版,附带开题报告和相关PPT等文档,供大家参考学习。也可在本博客主页找到更多下载资源、学习资料请访问CSDN下载频道.
全栈程序员站长
2022/11/09
1.5K0
基于单片机的智能交通灯控制系统的设计实验_单片机控制系统红绿灯设计
基于单片机的交通信号灯控制系统设计论文_交通信号灯控制设计
本系统采用STC89C51单片机以及单片机最小系统和74HC245驱动电路以及外围的按键和数码管显示等部件,设计一个基于单片机的交通灯设计。设计通过两位一体共阴极数码管显示,并能通过按键对定时进行设置。
全栈程序员站长
2022/11/08
1.3K0
基于单片机的交通信号灯控制系统设计论文_交通信号灯控制设计
交通灯控制逻辑电路设计实验报告_交通灯控制电路的设计报告
  这是一个数电实验,交通灯,如果使用FPGA或者单片机来完成的话,会简单很多,这里采用的是使用常规的计数器,触发器,门电路等基本器件搭建,扩展部分可以完成总通行时间在100s内任意设置,红、黄、绿灯亮的时间长短之和在100s内任意设置,其实想要超过100s只需要扩展相应的计数器,以及门电路即可,限制功能的往往是资源;
全栈程序员站长
2022/09/29
2.4K0
交通灯控制逻辑电路设计实验报告_交通灯控制电路的设计报告
基于单片机的交通信号灯系统设计开题报告_51单片机交通信号灯设计
4、东西和南北方向各有两个数码管,分别显示时间,东西和南北的时间是不一样的,相差黄灯的时间才是正确的;
全栈程序员站长
2022/09/27
7670
基于单片机的交通信号灯系统设计开题报告_51单片机交通信号灯设计
基于单片机的电子时钟设计(keil+protues仿真,含代码及原理图)
本学期单片机课程要求做课程设计,我选取的课题如下: 基于单片机的电子时钟设计,要求: (1)实时显示当前时间; (2)能够对时间进行设置; (3)包括年月日,小时,分钟,秒. (4)整点提醒功能. 经过一周的时间已实现上述功能,故在此分享一下;
全栈程序员站长
2022/09/15
4.7K2
基于单片机的电子时钟设计(keil+protues仿真,含代码及原理图)
基于单片机的简易声光报时时钟
本设计采用STC89C51单片机作为主控制器,外部加上74HC573驱动数码管。系统总体框图如下:
一条晒干的咸鱼
2024/11/19
1310
基于单片机的简易声光报时时钟
基于51单片机的交通灯控制设计的结论_c51单片机交通灯控制
1、了解交通灯的基本工作原理; 2、用Proteus模拟实现交通灯控制; 3、用Keil C51编程实现上述功能; 4、用Keil与Proteus联调。
全栈程序员站长
2022/11/08
2.2K0
基于51单片机的交通灯控制设计的结论_c51单片机交通灯控制
基于51单片机的自动浇花器电路
自动浇水灌溉系统设计方案,以AT89C51单片机为控制核心,采用模块化的设计方法。
芯动大师
2024/05/16
1580
基于51单片机的自动浇花器电路
基于51单片机的八路抢答器设计开题报告_8路抢答器设计51单片机
随着科学技术的发展和普及,各种各样的竞赛越来越多,其中抢答器的作用也越来越重要。本文设计出以STC89C52RC单片机为核心的八路抢答器。
全栈程序员站长
2022/11/01
5330
基于51单片机的八路抢答器设计开题报告_8路抢答器设计51单片机
基于51单片机的八位流水灯(三种形式)
基于AT89C51的流水灯:流水灯共八个,可以实现交替闪烁,一起闪烁,左右流水灯等效果。 模式一:按动key1,实现1,3,5,7和2,4,6,8交替闪烁; 模式二:按动key2,实现D1→D8流水灯效果; 模式三:按动key3,实现全部闪烁效果,时间间隔为0.5秒; 模式四:按动key4,实现D8→D1流水灯效果;
全栈程序员站长
2022/06/28
2.6K0
基于51单片机的八位流水灯(三种形式)
3.3 51单片机-独立按键
JP165跳线帽断开、JP10连接J12(为了实现按键控制LED灯的效果)、JP5连接JP8、J21接左边
DS小龙哥
2022/01/12
5610
3.3 51单片机-独立按键
基于单片机的八路抢答器的设计与实现_基于单片机的三路抢答器设计
1.以单片机为核心,设计一个八位竞赛抢答器:同时供八名选手或八个代表队比赛,分别用八个按钮S0~S7表示。
全栈程序员站长
2022/11/07
4150
设计分享|单片机交通灯仿真(汇编)
(1)东西红灯60S倒计时,南北绿灯40S倒计时,东西向人行道红灯,南北向人行道绿灯;
电子工程师成长日记
2022/07/27
8060
设计分享|单片机交通灯仿真(汇编)
【Electronics】数字电路实验——交通灯设计
为了确保十字路口的车辆顺利、畅通地通过,往往都采用自动控制信号灯来进行指挥。其中红灯(R)亮,表示该条道路禁止通行;黄灯(Y)亮表示停车;绿灯(G)亮表示允许通行。 本文探讨了简单的交通灯逻辑控制电路设计,设计了南北和东西两个方向的十字路口交通灯控制电路,同时实现简单的倒计时功能。
全栈程序员站长
2022/09/14
2.2K0
51单片机八路抢答器proteus仿真
由于51单片机小板,按键比较少,还有一些功能上的缺陷,所以说无法完成八路抢答器,所以我们用proteus仿真,代码与实验结果如下:
全栈程序员站长
2022/11/01
4930
推荐阅读
相关推荐
基于单片机的红绿灯/交通灯系统,自定义时间调节,C编程,仿真搭建
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验