ZipArchive创建无效的ZIP条目
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZipArchive创建无效的ZIP条目相关的知识,希望对你有一定的参考价值。
我正在使用ZipArchive并且它主要工作,我看到的一个问题是当文件下载时我无法使用Windows默认存档例程打开它。如果我单击zip文件并提取所有内容,我会收到一条错误消息,指出没有要提取的条目。任何人都知道为什么会这样吗?为了它的价值,我可以用7zip打开同一个文件并提取文件就好了。
public virtual ActionResult GetZip()
{
var summary = GetBytes();
var response = new MemoryStream();
using (var stream = new MemoryStream())
{
using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, true))
{
var entry = archive.CreateEntry("myfiletozip" + fileExt);
using (var writer = new BinaryWriter(entry.Open()))
{
writer.Write(summary, 0, summary.Length);
}
stream.Seek(0, SeekOrigin.Begin);
stream.CopyTo(response);
}
}
response.Seek(0, SeekOrigin.Begin);
return this.File(response, MediaTypeNames.Application.Zip, "myzipfilename.zip");
}
更新:
发现这个SO Answer并修改了我的来源,它正在工作....我仍然不知道为什么。
byte[] response;
using (var stream = new MemoryStream())
{
using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, true))
{
var entry = archive.CreateEntry("myfiletozip" + fileExt, CompressionLevel.Optimal);
using (var entryStream = entry.Open())
using (var fileToCompressStream = new MemoryStream(summary))
{
fileToCompressStream.CopyTo(entryStream);
}
}
response = stream.ToArray();
}
答案
ZipArchive在处理流时会向流中添加一些其他信息(例如.checksum),因此在ZipArchive对象处理之前,您不应该寻找流或使用它。
public virtual ActionResult GetZip()
{
var summary = GetBytes();
var response = new MemoryStream();
using (var stream = new MemoryStream())
{
using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, true))
{
var entry = archive.CreateEntry("myfiletozip" + fileExt);
using (var writer = new BinaryWriter(entry.Open()))
{
writer.Write(summary, 0, summary.Length);
}
}
//Use stream after archive is disposed
stream.Seek(0, SeekOrigin.Begin);
stream.CopyTo(response);
}
response.Seek(0, SeekOrigin.Begin);
return this.File(response, MediaTypeNames.Application.Zip, "myzipfilename.zip");
}
以上是关于ZipArchive创建无效的ZIP条目的主要内容,如果未能解决你的问题,请参考以下文章
我使用 PHP 的 ZipArchive 创建的 .zip 存档在 Windows 10 上已损坏/无效
PHP:使用 ZipArchive 创建 zip 文件时出现错误 (500)
如何使用 Sharpcompress .net 从 ZIP 存档中删除单个条目
php ZipArchive 压缩整个文件夹 - 自带ZipArchive类 - PHP递归创建目录压缩包