使用 ZipArchive 生成Zip文件备注
近两日研究了Abp.io 中模板项目的生成原理,是从Github下载源码包,进行修改、替换,然后生成新的zip包提供下载。
项目内部使用了 这个包 Ionic.Zip Version="1.9.1.8“ ,这个包 不支持 .NetCore 。
无法编译,项目文件中有: <AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
但还不清楚是什么作用。
报着学习的态度,尝试替换 Ionic.Zip 替换为 ZipArchive .官网上看了看文档,还比较顺利。。 也能生成Zip ,但生成的Zip始终报错,”文件末端错误 “。 只能一个一个步骤找原因。
这个是直接读,直接写,没有问题。---
1 public static void TestReadZipAndWriteToNewZip()
{
string path = @"D:\dev\Study\abpio\abp_io\src\Volo.AbpWebSite.Web\TemplateFiles\";
string srcFile = path + "test.zip";
string destFile = path + "test_dest.zip"; using (var readStream = File.OpenRead(srcFile))
{
using (var archive = new ZipArchive(readStream, ZipArchiveMode.Read))
{
using (var writeFileStream = new FileStream(destFile, FileMode.CreateNew))
{
using (var outZip = new ZipArchive(writeFileStream, ZipArchiveMode.Create))
{
foreach (var entry_item in archive.Entries)
{
var new_entry = outZip.CreateEntry(entry_item.FullName);
using (var stream = new_entry.Open())
{
entry_item.Open().CopyTo(stream);
}
} }
} }
}
}
里边可以注意到多层包裹,整个Zip要有Stream .内部的ZipArctiveEntry也要有留的。
从 ZipArctiveEntry 中读取 内容到字节数组
public static byte[] GetBytes(this ZipArchiveEntry zipFile)
{
using (var ms = new MemoryStream())
{
using (var stream = zipFile.Open())
{
stream.CopyTo(ms);
return ms.ToArray();
}
}
}
转换为可以处理的 内存文件列表
public static FileEntryList ToFileEntryList(this ZipArchive zipFile, string rootFolder = null)
{
var zipEntries = zipFile.Entries.ToList(); if (rootFolder != null)
{
zipEntries = zipFile.Entries.Where(entry =>
entry.FullName.StartsWith(rootFolder)).ToList();
}
var fileEntries = new List<FileEntry>();
foreach (var zipEntry in zipEntries)
{
var fileName = zipEntry.FullName;
if (rootFolder != null)
{
fileName = fileName.RemovePreFix(rootFolder);
} if (fileName.IsNullOrEmpty())
{
continue;
}
fileEntries.Add(new FileEntry(fileName, zipEntry.GetBytes(), zipEntry.IsDirectory());
} return new FileEntryList(fileEntries);
}
private static FileEntryList GetEntriesFromZipFile(string filePath, string rootFolder = null)
{
using (var templateFileStream = File.OpenRead(filePath))
{ using (var archive = new ZipArchive(templateFileStream, ZipArchiveMode.Read))
{ return archive.ToFileEntryList(rootFolder);
}
}
}
private static byte[] CreateZipFileFromEntries(FileEntryList entries)
{
using (var stream = new MemoryStream())
{
using (var resultZipFile = new ZipArchive(stream,ZipArchiveMode.Create))
{
entries.CopyToZipFile(resultZipFile); }
//重点在这里: 生成的Zip的流数据返回,一定要在 ZipArchive 的生存期外边!!!!
//如果是直接 写入 FileStream 无所谓 。但要作为 Byte[] 返回 一定要等到释放,或者说,完成压缩后。
//猜测是 在销毁的时候写入Stream的, 没有看到 ZipArchive 的源码,只能猜测。
return stream.ToArray();
}
} 虽然花费了不少时间,但总算解决了,~~~~
使用 ZipArchive 生成Zip文件备注的更多相关文章
- java 生成zip文件并导出
总结一下,关于Java下载zip文件并导出的方法,浏览器导出. String downloadName = "下载文件名称.zip"; downloadName = Browser ...
- 013-Go通archive/zip生成ZIP文件
package main import( "io/ioutil" "os" "bytes" "archive/zip" ...
- Java 生成ZIP文件
public static byte[] fileToZip(){ ZipOutputStream append = null; ByteArrayOutputStream bos = new Byt ...
- 【.NET深呼吸】Zip文件操作(2):动态生成Zip文档
通过前面一篇烂文的介绍,大伙儿知道,ZipArchive类表示一个zip文档实例,除了用上一篇文章中所列的方法来读写zip文件外,还可以直接通过ZipArchive类,动态生成zip文件. 文件流操作 ...
- salesforce 零基础学习(五十三)多个文件生成一个zip文件(使用git上封装的代码)
此篇参考git代码:https://github.com/pdalcol/Zippex 学习salesforce可以访问一个朋友的网站:https://www.xgeek.net 首先感谢git上提供 ...
- java直接生成zip压缩文件精简代码(跳过txt文件)
/** * @param args */ public static void main(String[] args) throws Exception{ ZipOutputStream zos = ...
- 通过javascript在网页端生成zip压缩包并下载
zip.js是什么 zip.js的github项目地址:http://gildas-lormeau.github.io/zip.js/ 通过zip.js封装一个能在网页端生成zip文件的插件, 直接在 ...
- 动态生成Zip
动态生成Zip文档 通过前面一篇烂文的介绍,大伙儿知道,ZipArchive类表示一个zip文档实例,除了用上一篇文章中所列的方法来读写zip文件外,还可以直接通过ZipArchive类,动态生成 ...
- 使用gulp在开发过程中合理导出zip文件
最近一段时间一直在做桌面混合应用,跟以往做web端不同的是,无法再通过在浏览器上输入内部的域名来随时跟踪开发版本的状况了,只能通过打包代码让产品或领导随时跟踪进度. 这里就涉及到一些问题了: 1,需要 ...
随机推荐
- Qt QGraphicsItem要点 积累
1.在创建QGraphicsItem子类的时候,想要实现自己绘图,一般是重新实现boundingRect()和paint()函数,如果不重新实现shape(),基类的实现将会退而使用 bounding ...
- 硬件笔记之MacMini开启HiDPI
0x00 概述 先科普一下,有关retina和HiDPI那点事 ,Macmini在2k显示器的显示太小了,看起来费眼,没办法,苹果原生HiDPI是支持4k显示器的,所以以后买显示器,直接买4k的一步到 ...
- 关于新写的js在浏览器f12的时候看不到解决办法
这是由于浏览器缓存导致的,谷歌浏览器ctrl+shift+delete快捷键到清除浏览器数据清除即可.平时经常会遇到的,所以记录下.
- APIO 2014 回文串(Manacher+后缀自动机+倍增)
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=3676 思路 好像还是回文自动机裸体,但是 \(\text{Manacher}\) +后缀自动 ...
- 后台获取POST方式提交的JSON格式数据
1.直接使用request.getParamater()的方法获取(这种取参方式对于POST和GET的提交方式均适用): 2.通过请求体的IO流获取参数(这种方式只能用于POST,因为GET方式没有请 ...
- 流程与IT管理是未来IT行业发展的必经之路
流程与IT管理是未来IT行业发展的必经之路 PM圈子 百家号17-11-2411:30 本文由“光环国际”—中国项目管理PMP培训上市企业转载 IT部门的职责之所以能够从辅助部门发展成业务支撑部门,最 ...
- python生成可执行exe文件
为什么要生成可执行文件 不需要安装对应的编程环境 可以将你的应用闭源 用户可以方便.快捷的直接使用 打包工具 pyinstaller 安装pyinstaller pip install pyinsta ...
- 生信工具汇总--OMICtools
各种生信工具: https://omictools.com/
- React-native完整配置流程
开头敲黑板!! 无论你是RN的新手还是老手,跟着流程走,RN项目搭建起来完全不是问题! 一.网址收集 expo配置网址:https://blog.expo.io/building-a-react- ...
- 学习笔记74—函数argsort()
****************************************************** 如有谬误,请联系指正.转载请注明出处. 联系方式: e-mail: heyi9069@gm ...