ZipArchive创建无效的ZIP条目
问题描述:
我正在使用ZipArchive,它主要工作,我看到的一个问题是,当文件下载我无法打开它与Windows默认归档例程。如果我单击压缩文件并提取所有内容,我会收到一条错误消息,指出没有要提取的条目。任何人都知道这是为什么发生?对于它的价值,我可以用7zip打开相同的文件,并提取文件就好了。ZipArchive创建无效的ZIP条目
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");
}
UPDATE:
发现这个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添加一些额外的信息(eg.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");
}
'this.File(...)'做了什么? – Dawnkeeper
我认为问题在于我没有明确地处理entry.Open()在第二个示例/ update中,如果为条目添加了另一个using语句,这似乎给了我正确的行为。 –