ziarchive 中的中央目录损坏错误
Central Directory corrupt error in ziparchive
在我的 C# 代码中,我试图创建一个 zip 文件夹供用户在浏览器中下载。所以这里的想法是用户点击下载按钮,他得到一个 zip 文件夹。
出于测试目的,我使用单个文件并将其压缩,但当它工作时,我将有多个文件。
这是我的代码
var outPutDirectory = AppDomain.CurrentDomain.BaseDirectory;
string logoimage = Path.Combine(outPutDirectory, "images\error.png"); // I get the file to be zipped
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.BufferOutput = false;
HttpContext.Current.Response.ContentType = "application/zip";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=pauls_chapel_audio.zip");
using (MemoryStream ms = new MemoryStream())
{
// create new ZIP archive within prepared MemoryStream
using (ZipArchive zip = new ZipArchive(ms))
{
zip.CreateEntry(logoimage);
// add some files to ZIP archive
ms.WriteTo(HttpContext.Current.Response.OutputStream);
}
}
当我尝试这个东西时它给我这个错误
Central Directory corrupt.
[System.IO.IOException] = {"An attempt was made to move the position before the beginning of the stream."}
异常发生在
using (ZipArchive zip = new ZipArchive(ms))
有什么想法吗?
您在未指定模式的情况下创建 ZipArchive
,这意味着它首先尝试从中读取,但没有可读取的内容。您可以通过在构造函数调用中指定 ZipArchiveMode.Create
来解决该问题。
另一个问题是您在 关闭 ZipArchive
之前将 MemoryStream
写入输出 ... 这意味着 ZipArchive
代码没有机会做任何内务处理。您需要将写入部分移动到嵌套的 using
语句之后 - 但请注意,您需要更改创建 ZipArchive
的方式以保持流打开:
using (MemoryStream ms = new MemoryStream())
{
// Create new ZIP archive within prepared MemoryStream
using (ZipArchive zip = new ZipArchive(ms, ZipArchiveMode.Create, true))
{
zip.CreateEntry(logoimage);
// ...
}
ms.WriteTo(HttpContext.Current.Response.OutputStream);
}
在我的 C# 代码中,我试图创建一个 zip 文件夹供用户在浏览器中下载。所以这里的想法是用户点击下载按钮,他得到一个 zip 文件夹。
出于测试目的,我使用单个文件并将其压缩,但当它工作时,我将有多个文件。
这是我的代码
var outPutDirectory = AppDomain.CurrentDomain.BaseDirectory;
string logoimage = Path.Combine(outPutDirectory, "images\error.png"); // I get the file to be zipped
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.BufferOutput = false;
HttpContext.Current.Response.ContentType = "application/zip";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=pauls_chapel_audio.zip");
using (MemoryStream ms = new MemoryStream())
{
// create new ZIP archive within prepared MemoryStream
using (ZipArchive zip = new ZipArchive(ms))
{
zip.CreateEntry(logoimage);
// add some files to ZIP archive
ms.WriteTo(HttpContext.Current.Response.OutputStream);
}
}
当我尝试这个东西时它给我这个错误
Central Directory corrupt.
[System.IO.IOException] = {"An attempt was made to move the position before the beginning of the stream."}
异常发生在
using (ZipArchive zip = new ZipArchive(ms))
有什么想法吗?
您在未指定模式的情况下创建 ZipArchive
,这意味着它首先尝试从中读取,但没有可读取的内容。您可以通过在构造函数调用中指定 ZipArchiveMode.Create
来解决该问题。
另一个问题是您在 关闭 ZipArchive
之前将 MemoryStream
写入输出 ... 这意味着 ZipArchive
代码没有机会做任何内务处理。您需要将写入部分移动到嵌套的 using
语句之后 - 但请注意,您需要更改创建 ZipArchive
的方式以保持流打开:
using (MemoryStream ms = new MemoryStream())
{
// Create new ZIP archive within prepared MemoryStream
using (ZipArchive zip = new ZipArchive(ms, ZipArchiveMode.Create, true))
{
zip.CreateEntry(logoimage);
// ...
}
ms.WriteTo(HttpContext.Current.Response.OutputStream);
}