C#实现压缩与解压的方案有很多,比如以下几种:

1. Ionic.Zip (第三方 太老、不支持内存压缩)(网上有使用例子:https://www.cnblogs.com/chenghu/p/4607866.html)

2. SharpZipLib和DotNetZip (第三方,一款比较经典实用C#压缩类库)

3. ZipArchive 和 ZipFile(.NET 4.5 System.IO.Compression命名空间中新提供的压缩类)(以下是该方案的实现例子)

一、ZipArchive 和 ZipFile例子

在 4.5 之前,处理压缩文件,我们经常需要使用第三方的类库 SharpZipLib, 现在可以直接实现了。

1.准备工作

首先做一下准备工作,需要确保你使用 .NET 4.5 版,可以在项目的属性窗口中检查一下。

然后,引用必须的程序集。

程序集有两个:System.IO.Compression 和 System.IO.Compression.FileSystem.

类似于对文件和目录的操作,对于压缩文件也提供了两种方式:ZipArchive 和 ZipFile,分别对应两个新增加的类 ZipArchive 和 ZipFile。这两个类都定义在命名空间 System.IO.Compression 中。

为了后面演示方便,我们定义一个表示压缩文件路径的常量。

const string zipFilePath = @"..\..\Sample.zip";

2. 使用 ZipArchive

先看ZipArchive的使用。

2.1 创建压缩文件

创建一个空的压缩文件,使用 ZipArchiveMode.Create 创建参数。

// 创建 Zip 文件
using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Create))
using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Create))
{}

使用 WinRaR 打开压缩文件,可以看到里面没有文件。

2.2 创建并添加文件

通常,在创建的同时,我们就会加入一些文件,下面的例子中,我们将当前的执行程序文件本身加到压缩文件中。

// 创建并添加被压缩文件
using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Create))
using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Create))
{System.Reflection.Assembly assemble = System.Reflection.Assembly.GetExecutingAssembly();string path = assemble.Location;string filename = System.IO.Path.GetFileName(path);ZipArchiveEntry readMeEntry = archive.CreateEntry(filename);using (System.IO.Stream stream = readMeEntry.Open()){byte[] bytes = System.IO.File.ReadAllBytes(path);stream.Write(bytes, 0, bytes.Length);}
}

现在,打开压缩文件,可以看到文件已经被压缩进来了。

2.3 列出压缩文件内容

当然,也可以通过程序检查压缩文件的内容了。使用 Read 方式就可以了。

// 列出压缩压缩文件
using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Open))
using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Read))
{foreach (var zipArchiveEntry in archive.Entries)Console.WriteLine("FullName of the Zip Archive Entry: {0}", zipArchiveEntry.FullName);
}

2.4 提取压缩文件

当然可以从压缩文件中提取被压缩的内容了。

// 读取其中一个文件的内容
using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Open))
using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Read))
{// 解压某个文件ZipArchiveEntry entry = archive.GetEntry("ZipArchiveSample.exe");Console.WriteLine(entry.Name);using (System.IO.Stream stream = entry.Open()){System.IO.Stream output = new FileStream("http://www.cnblogs.com/ZipArchiveSample.exe", FileMode.Create);int b = -1;while ((b = stream.ReadByte()) != -1){output.WriteByte((byte) b);}output.Close();}}

2.5 更新压缩文件

在压缩文件已经创建之后,还可以打开它,继续添加文件,这就称为更新了,使用 Update 模式。

// 向现有的压缩文件中添加文件
using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Open))
using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Update))
{// 这里添加当前正在执行的程序文件本身System.Reflection.Assembly assemble = System.Reflection.Assembly.GetExecutingAssembly();string path = assemble.Location;string filename = System.IO.Path.GetFileName( path);ZipArchiveEntry readMeEntry = archive.CreateEntry( filename );using (System.IO.Stream stream = readMeEntry.Open() ){byte[] bytes = System.IO.File.ReadAllBytes(path);stream.Write(bytes, 0, bytes.Length);}foreach (var zipArchiveEntry in archive.Entries)Console.WriteLine("FullName of the Zip Archive Entry: {0}", zipArchiveEntry.FullName);
}

现在压缩文件中又增加了一个,这可以一个怪异的文件,同一个文件被在压缩文件中添加了两次!

3. 使用 ZipFile

除了上边的基本方法之外,还有一些简单的使用方法。这涉及到另外一个类:ZipFile。

3.1 创建空压缩文件

// 删除压缩文件
System.IO.File.Delete(zipFilePath);// 使用 ZipFile 的静态方法创建压缩文件,要保证文件没有存在
using (ZipArchive zipArchive = ZipFile.Open(zipFilePath, ZipArchiveMode.Create))
{
}

3.2 创建并添加文件

直接添加一个文件的方法。直接使用 CreateEntryFromFile 就可以了。

System.IO.File.Delete(zipFilePath);// 使用 CreateEntryFromFile 方法添加文件
// 使用 ZipFile 的静态方法创建压缩文件
using (ZipArchive zipArchive = ZipFile.Open(zipFilePath, ZipArchiveMode.Create))
{System.Reflection.Assembly assemble = System.Reflection.Assembly.GetExecutingAssembly();string path = assemble.Location;string filename = System.IO.Path.GetFileName(path);zipArchive.CreateEntryFromFile(path, filename);
}

3.3 解压文件

将压缩文件解压到指定的目录中。

// 解压文件
ZipFile.ExtractToDirectory(zipFilePath, "../..");

3.4 压缩一个目录

还可以直接将一个目录中所有的文件都压缩到一个压缩文件中。

// 压缩指定目录中所有文件
System.IO.File.Delete(zipFilePath);
ZipFile.CreateFromDirectory(".", zipFilePath);

你是不是最喜欢这个方法?现在压缩文件中的文件更多了。

二、MVC中利用SharpZipLib实现文件流直接打包成压缩包:

【https://www.cnblogs.com/hgmyz/p/12351598.html】

using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
using System.IO;
//控制器写法
public FileResult PrintData()
{byte[] bytePDF = 需要打包的文件流;byte[] result = null;using (MemoryStream ms = new MemoryStream()){using (ZipOutputStream zipStream = new ZipOutputStream(ms)){zipStream.Password = "123456";//设置压缩包密码ZipEntry entry = new ZipEntry("文件名");entry.DateTime = DateTime.Now;//创建时间zipStream.PutNextEntry(entry);zipStream.Write(bytePDF, 0, bytePDF.Length);zipStream.CloseEntry();zipStream.IsStreamOwner = false;zipStream.Finish();zipStream.Close();ms.Position = 0;//压缩后的数据被保存到了byte[]数组中。result = ms.ToArray();}}return File(result, "application/zip", "文件名.zip");
}

Asp.Net(Web From) 输出ZIP文件

//https://www.cnblogs.com/sntetwt/p/11094789.html
Response.ContentType = "application/zip";
using (var fs = System.IO.File.OpenRead(file))
{var b = new byte[1024];int n;while ((n = fs.Read(b, 0, b.Length)) > 0){Response.OutputStream.Write(b, 0, n);}
}
Response.Close();

附录:

SharpZipLib 的下载地址: http://www.icsharpcode.net/OpenSource/SharpZipLib/

C#实现压缩与解压缩方案相关推荐

  1. 7z压缩 lzma流式压缩、解压缩的实现 C语言

    最近项目中遇到OTA固件升级,压缩由上位机实现,解压缩在boot启动时,读取固件内容后边解压边加载数据的方式启动. 前期预研了三种压缩方案,分别是lz4.zip.7z,代码仓库放在下面,三者各自的原理 ...

  2. 数据压缩及解压缩算法,多种文件的压缩与解压缩-java android

    > 数据压缩算法,文本压缩算法 几种压缩算法原理介绍- https://blog.csdn.net/clevercode/article/details/46691645 文本压缩算法的对比和选 ...

  3. Linux常用压缩与解压缩命令

    .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) --------------- .gz 解压 ...

  4. java 文件压缩 解压_Java文件压缩与解压缩(一)

    package com.cn; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream ...

  5. GZip压缩与解压缩

    GZIP的压缩与解压缩代码: public static class CompressionHelper{/// <summary> /// Compress the byte[] /// ...

  6. linux系统打包工具,Linux 压缩、解压缩和打包工具

    前言:你是否曾经因为某个文件占用空间较大,而空间紧缺的U盘无法存放此文件.你是否曾经因为软件里有太多文件而不方便复制和携带.你是否曾因需要备份太过零散而头疼.那么基于"文件压缩和打包&quo ...

  7. Linux 常用的压缩与解压缩命令详解

    Linux 常用的压缩与解压缩命令有:tar.gzip.gunzip.bzip2.bunzip2.compress .uncompress. zip. unzip.rar.unrar 等. tar 最 ...

  8. linux的文件压缩与解压缩,linux(文件压缩与解压缩)

    压缩解压 linux下怎么解后缀名是gzip的文件? 1.以.a为扩展名的文件: #tar xv file.a 2.以.z为扩展名的文件: #uncompress file.Z 3.以.gz为扩展名的 ...

  9. aix解压tgz_AIX 上压缩与解压缩 各种文件格式原理说明

    .gz gzip – d 或 gunzip gzip .Z uncompress compress .tar tar -xvf tar – cvf .cpio cpio -idumv .zip unz ...

最新文章

  1. NSString属性什么时候用copy,什么时候用strong?
  2. php桶排序,PHP实现桶排序算法
  3. 如果刘华强是个码农...
  4. python常用内置模块-Python之OS模块常用内置方法汇总
  5. mysql5.7.1.9二进制安装_mysql 5.7.9 linux二进制安装
  6. LSA(链路状态通告)类型
  7. 使用C#实现Windows下无焦点窗体
  8. 每个程序员都应该了解的内存知识【第一部分】
  9. 研究SAP service order status存储字段
  10. 神龙X-Dragon,这技术“范儿”如何?| 问底中国IT技术演进
  11. Java 答疑:为什么修改 Java 环境变量之后 java -version 不变?解决方式汇总
  12. 安装hadoop集群---resourcemanager和NameNode同一台机器上
  13. ​iPhone 12全线跌破发行价;三星扩大众包定位网络;Fedora 33发布|极客头条
  14. 技术沙龙|实力赋能开发者,助力企业从容应对数字化转型难题
  15. visual studio(vs)中项目解决方案的目录组织安排
  16. matlab 不确定度计算器,不确定度计算器
  17. 构建基于浏览器的Web P2P网络直播
  18. Dymola-多学科系统仿真工具
  19. 四十八种微信公众号加人方法
  20. 正确认识使用Word模板

热门文章

  1. 【入门AUTOSAR网络管理测试】RSS-NOS状态转换
  2. Vue实现简单聊天对话框案例
  3. 两个电脑文件如何同步
  4. OpenGL with QtWidgets:练习之扑克翻转
  5. 北航周号益:从“鹦鹉”到“乌鸦”,AI的本质是探索通用智能的可能性
  6. css介绍css选择器
  7. 伞源科技Pinpoint和sonarQube对比
  8. 腾讯云(云镜)主机入侵检测漏洞检测
  9. Python灰帽子笔记二
  10. 开发一款APP需要多少钱