近两日研究了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. tomcat部署项目

    提示:指定jdk版本  在bin路径下的setclasspath.bat文件添加 set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_201 set JRE_HO ...

  2. Path Analyzer Pro出现raw socket问题

    使用windows7,8以及10平台运行一个traceroute liketools软件,名为Path Analyzer Pro 2.7,遇到raw socket问题,如图: 原因是raw socke ...

  3. nodejs基础快速上手

    node 快速了解 hello node.js console.log("hello Node.js"); let http = require("http") ...

  4. 删除zabbix数据库日志

    #!/bin/bashuser="root"passwd="361way"timedate=`date -d $(date -d "-90 day&q ...

  5. 富文本编辑器Quill(一)简单介绍

    Quill是一个很流行的富文本编辑器,github上star大约21k: github:https://github.com/quilljs/quill/ 官网: https://quilljs.co ...

  6. wordpress安装教程

    最近安装了wordpress来搭建自己的网站,过程有些艰辛,以防以后转移服务器再次遇到这个难题,在此记下自己的这次安装过程以及一些问题,同时也供遇到相同问题的初次接触者做参考. 另外说明一下我用的操作 ...

  7. mysql5.7.21下载及安装步骤

    以前都是用的5.6的数据库,现在想着换个新版本数据库.跟上时代的步伐,于是安装了一天才安装好.具体步骤如下: 1.官网下载mysql解压zip版,由于客户端安装版都是32位的,我的电脑是64位系统,所 ...

  8. Bootstrap各种进度条的实例讲解

    本章将讲解 Bootstrap 进度条.在本教程中,您将看到如何使用bootstrap教程.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Interne ...

  9. Appium测试安卓apk遇到的问题及解决方法

    1.Showing error - “Returned value cannot be converted to WebElement: {ELEMENT=1}  解决方法:https://sqa.s ...

  10. 从客户端取到浏览器返回的oauth凭证

    这个随便记录一下,也是朋友问我的一个问题. 在网上找了下,没找到相关的,用英文也搜索了一下,可能我的关键词没找对,找了一会没找到. 想到以前用过的rclone也是用的这样的方式,去看了下相关部分源码. ...