使用 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,需要 ...
随机推荐
- 标签EL和JSTL解读
1. EL标签:出现代替输出:<%=%> EL输出格式(特点:只能输出,不带逻辑) ${key值} 查找顺序:page,request,session,application **在不加 ...
- APScheduler
目录 APScheduler简介 支持的后端存储作业 集成的Python框架 APScheduler下载安装 APScheduler组件 各组件简介 调度器 作业存储器 执行器 触发器 使用 添加作业 ...
- SAP 打印自动导出PDF本地文件(自己做的例子)
smartforms导出PDF: 常用函数有: convert_otfconvert_otfspooljob_2_pdfconvert_abapspooljob_2_pdfCONVERT_OTF_2_ ...
- 关于Excel报错
今天,用POI做一个Excel的导出时,总是报空指针错误.后来经过我仔细的查找翻阅日志才发现问题的真正所在: 报错如下: HTTP Status 500 - Request processing fa ...
- cssselector元素定位
转自https://blog.csdn.net/qq_40024178/article/details/78945651 一.概述 cssSelector也是一种常用的选择器,CSS locator比 ...
- python 环境安装和卸载1
同事换了新机器,系统从win7变为了win10,因此需要重新安装python环境啦!不废话,直奔主题. A 安装 一.进入python官网 www.python.org 进入downloads-&g ...
- centos卸载mysql
1.查看系统安装mysql rpm -qa|grep -i mysql 2.卸载 rpm -ev --nodeps mysql-community-release-el7-5.noarch 3.查询剩 ...
- JS高程12.2.3元素大小的学习笔记
<JavaScript高级程序设计>中讲述了通过JS如何控制页面中元素的大小,其中涉及到三对属性:偏移量,客户区大小,滚动大小.以前自己经常看到这三对属性,但是具体不是很清楚,容易混淆.所 ...
- ios中关键词weak,assign,copy.strong等的区别
虽然开发IOS好多年了.但是这几个关键词总是深深困扰着我.加上IOS开发从mRC到ARC的过渡,这些概念更为困扰我了. 先说weak与assign.weak只能修饰对象,不能修饰基本数据类型.而ass ...
- 【python 3】 集合方法操作汇总
基本数据类型 : set 集合(set)特点 : 无序 不能重复(自动去重) 用 {} 或 set()函数 来表示集合 空集合 : set() 1 name = {"江户部柯南", ...