使用SharpZipLib压缩打包多个内存中的文件

简介:
SharpZipLib是C#写的开源压缩解压缩组件,最近项目上遇到一个需求:根据用户选择的项目生成CSV文件并下载,后来改为同时生成2个CSV文件下载下来。想到的解决办法就是将2个CSV文件打包成一个Zip文件,然后供用户下载。

SharpZipLib可以通过很简单的代码就将多个文件打包成一个zip包,形如:

using (ZipFile zip = ZipFile.Create(@"E:\test.zip"))
{
zip.BeginUpdate();
ZipEntry e=new ZipEntry("a");
//添加文件
zip.Add(@"E:\a.csv");
zip.Add(@"E:\b.csv");
zip.CommitUpdate();
}

但是这里的问题是,zip.Add方法允许添加文件,但是不允许直接添加字符串或者byte[],但是我们做的是WebApplication,不希望是在Web服务器上把两个CSV文件生成后保存到硬盘上,然后调用上面的方法压缩硬盘上的文件。我们的文件应该都是在内存中生成,在内存中打包,然后直接把生成的zip文件的二进制流返回给用户,让用户下载。幸好该方法提供了一个IStaticDataSource接口参数,该接口有个返回Stream的GetSource方法,我们可以实现该接口,从而支持字符串文件的打包。

class StringDataSource : IStaticDataSource
{
public string Str { get; set; }

public StringDataSource(string str)
{
this.Str = str;
}

public Stream GetSource()
{
Stream s = new MemoryStream(Encoding.Default.GetBytes(Str));
return s;
}
}

实现了该接口后,那么我们压缩两个String成两个文本文件的包,代码就十分简单了:

using (ZipFile zip = ZipFile.Create(@"E:\test2.zip"))
{
zip.BeginUpdate();
StringDataSource d1 = new StringDataSource("this a test1");
StringDataSource d2 = new StringDataSource("压缩文件2的内容");
//添加文件
zip.Add(d1, "Test1.txt");
zip.Add(d2, "Test2.txt");
zip.CommitUpdate();
}

上面的代码还是在硬盘上生成了test2.zip,幸好ZipFile.Create方法支持Stream参数,于是可以将代码改为:

MemoryStream stream=new MemoryStream();
using (ZipFile zip = ZipFile.Create(stream))
{
zip.BeginUpdate();
StringDataSource d1 = new StringDataSource("this a test1");
StringDataSource d2 = new StringDataSource("压缩文件2的内容");
//添加文件
zip.Add(d1, "Test1.txt");
zip.Add(d2, "Test2.txt");
zip.CommitUpdate();
}

然后将stream继续Render给用户即可。

同样的方式,如果是在内存中生成了二进制文件,也可以使用实现IStaticDataSource接口的方式来打包。

目录
相关文章
|
4月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
453 55
|
6月前
|
分布式计算 算法 Java
|
11月前
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
301 0
|
11月前
|
程序员 Windows
程序员必备文件搜索工具 Everything 带安装包!!! 比windows自带的文件搜索快几百倍!!! 超级好用的文件搜索工具,仅几兆,不占内存,打开即用
文章推荐了程序员必备的文件搜索工具Everything,并提供了安装包下载链接,强调其比Windows自带搜索快且占用内存少。
277 0
|
12月前
|
存储 安全 Linux
将文件映射到内存,像数组一样访问
将文件映射到内存,像数组一样访问
190 0
|
Java
jmap 查看jvm内存大小并进行dump文件内存分析
jmap 查看jvm内存大小并进行dump文件内存分析
368 3
|
Python
python3获取内存和cpu利用率记录日志文件psutil
python3获取内存和cpu利用率记录日志文件psutil
167 1
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
118 0
|
存储 缓存 算法
详解JVM内存优化技术:压缩指针
详解JVM内存优化技术:压缩指针
有 3 个进程 P1、P2、P3 协作解决文件打印问题。P1 将文件记录从磁盘读入内存的缓冲区 1,每执行一次读一个记录 ;P2 将缓冲区 1 中的内容复制到缓冲区 2 中,每执行一次复制一个记录 ;
有 3 个进程 P1、P2、P3 协作解决文件打印问题。P1 将文件记录从磁盘读入内存的缓冲区 1,每执行一次读一个记录 ;P2 将缓冲区 1 中的内容复制到缓冲区 2 中,每执行一次复制一个记录 ;

热门文章

最新文章