ziparchive中的中央目录损坏错误

本文关键字:损坏 错误 ziparchive | 更新日期: 2023-09-27 18:21:42

在我的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);
             }
     }

当我尝试这个东西时,它会给我这个错误

中央目录已损坏。

[System.IO.IOException]={试图移动流开始之前的位置

出现异常

使用(ZipArchive zip=新ZipArchive(ms))

有什么想法吗?

ziparchive中的中央目录损坏错误

您在创建ZipArchive时没有指定模式,这意味着它将首先尝试从中读取,但没有可读取的内容。可以通过在构造函数调用中指定ZipArchiveMode.Create来解决此问题。

另一个问题是在关闭ZipArchive之前将MemoryStream写入输出。。。这意味着CCD_ 5代码没有机会进行任何内务管理。您需要将编写部分移到嵌套的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);
 }
相关文章: