近两日研究了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文件备注的更多相关文章

  1. java 生成zip文件并导出

    总结一下,关于Java下载zip文件并导出的方法,浏览器导出. String downloadName = "下载文件名称.zip"; downloadName = Browser ...

  2. 013-Go通archive/zip生成ZIP文件

    package main import( "io/ioutil" "os" "bytes" "archive/zip" ...

  3. Java 生成ZIP文件

    public static byte[] fileToZip(){ ZipOutputStream append = null; ByteArrayOutputStream bos = new Byt ...

  4. 【.NET深呼吸】Zip文件操作(2):动态生成Zip文档

    通过前面一篇烂文的介绍,大伙儿知道,ZipArchive类表示一个zip文档实例,除了用上一篇文章中所列的方法来读写zip文件外,还可以直接通过ZipArchive类,动态生成zip文件. 文件流操作 ...

  5. salesforce 零基础学习(五十三)多个文件生成一个zip文件(使用git上封装的代码)

    此篇参考git代码:https://github.com/pdalcol/Zippex 学习salesforce可以访问一个朋友的网站:https://www.xgeek.net 首先感谢git上提供 ...

  6. java直接生成zip压缩文件精简代码(跳过txt文件)

    /** * @param args */ public static void main(String[] args) throws Exception{ ZipOutputStream zos = ...

  7. 通过javascript在网页端生成zip压缩包并下载

    zip.js是什么 zip.js的github项目地址:http://gildas-lormeau.github.io/zip.js/ 通过zip.js封装一个能在网页端生成zip文件的插件, 直接在 ...

  8. 动态生成Zip

    动态生成Zip文档   通过前面一篇烂文的介绍,大伙儿知道,ZipArchive类表示一个zip文档实例,除了用上一篇文章中所列的方法来读写zip文件外,还可以直接通过ZipArchive类,动态生成 ...

  9. 使用gulp在开发过程中合理导出zip文件

    最近一段时间一直在做桌面混合应用,跟以往做web端不同的是,无法再通过在浏览器上输入内部的域名来随时跟踪开发版本的状况了,只能通过打包代码让产品或领导随时跟踪进度. 这里就涉及到一些问题了: 1,需要 ...

随机推荐

  1. 代码修改WinForm datagridview 样式 及数据绑定

    #region 表格设置 /// <summary> /// 调整表格 /// </summary> /// <param name="dataGrid&quo ...

  2. 继承 派生 super()经典类 新式类

    '''1什么是继承? 继承一种新建类的方式,在python中支持一个儿子继承多个爹 新建的类称为子类的或者派生类 父类有可以称为基类或者超类 子类会‘遗传’父类的属性 2 为什么要用继承 减少代码冗余 ...

  3. ELK学习笔记之logstash安装logstash-filter-multiline(在线离线安装)

    0x00 概述 ELK-logstash在搬运日志的时候会出现多行日志,普通的搬运会造成保存到ES中单条单条,很丑,而且不方便读取,logstash-filter-multiline可以解决该问题 g ...

  4. Let’s Encrypt 通配符证书申请配置

    首先你可以查看下官方提供的支持申请通配符证书的客户端列表:https://letsencrypt.org/docs/client-options/. 这些客户端支持最新的ACME v2接口,而这个接口 ...

  5. Getting Started with Word2Vec

    Getting Started with Word2Vec 1. Source by Google Project with Code: https://code.google.com/archive ...

  6. Python day 02

    基础&运算符 今日概要 循环 字符串格式化 运算符 编码 内容回顾 & 补充 内容回顾 计算机基础 解释器python 2 和 python 3 语法 print input if / ...

  7. Python3 tkinter基础 Tk quit 点击按钮退出窗体

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  8. Unity3D制作红色射线

    1.在发射射线的位置创建一个空物体用于存储发射点的位置信息. 2.制作射线,为发射射线物体添加LineRenderer组件  制作Material材质并把其类型改为Particles/Addictiv ...

  9. CAP原则和BASE定理

    CAP原则和BASE定理 分布式系统 来自个人OneNote 以CAP理论为基础的三种解决方案 1.两阶段提交 所谓的两个阶段是指:第一阶段:准备阶段(投票阶段)和第二阶段:提交阶段(执行阶段). 准 ...

  10. js form表单的校验

    if(!$("#form").validate().form()){ return false;} <元素 class="required">< ...