C# ziparchive中的中心目录损坏错误

C# ziparchive中的中心目录损坏错误,c#,ziparchive,C#,Ziparchive,在我的c代码中,我试图创建一个zip文件夹,供用户在浏览器中下载。所以这里的想法是,用户点击下载按钮,就会得到一个zip文件夹 出于测试目的,我使用一个文件并压缩它,但当它工作时,我将有多个文件 这是我的密码 var outPutDirectory = AppDomain.CurrentDomain.BaseDirectory; string logoimage = Path.Combine(outPutDirectory, "images\\error.png"); //

在我的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
,但没有指定模式,这意味着它试图先从中读取,但没有什么可读取的。您可以通过在构造函数调用中指定
ZipArchiveMode.Create
来解决这个问题

另一个问题是,在关闭
ZipArchive
之前,您正在将
MemoryStream
写入输出。。。这意味着ZipArchive公司没有机会做任何家务。您需要使用语句将写入部分移动到嵌套的
之后-但请注意,您需要更改创建
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);
 }

@乔杜里莫西纳利:啊。如果你一开始就这么说的话,那会有帮助。@ChaudhryMohsinAli:要学习的课程总是在发布错误时包含完整的堆栈跟踪。我还在调查。@ChaudhryMohsinAli:看我的编辑。我已经测试了这段代码,它似乎工作得很好。@ChaudhryMohsinAli:如果这是从ASP.NET运行的,那么可能文件不是您认为的位置。。。您可能需要先解析相对于web上下文的文件名。@ChaudhryMohsinAli:我不是ASP.NET开发人员,但我相信这取决于您使用的版本等。
HttpServerUtility.MapPath
是一种方法,但是现在可能有更好的方法。如果您正在尝试解压缩文件,请注意:如果压缩文件位于OneDrive文件夹中,并且OneDrive已关闭,并且文件已设置为联机模式,则会出现相同的错误。只要再次打开OneDrive,它就会工作。