ZipArchive返回空文件c#

ZipArchive返回空文件c#,c#,asp.net,compression,C#,Asp.net,Compression,所以我已经实现了压缩文件,但现在我有另一个问题,压缩文件夹包含空文件。压缩的文件大小为0字节 这就是我压缩文件的方式 try { var outPutDirectory = AppDomain.CurrentDomain.BaseDirectory; string logoimage = Path.Combine(outPutDirectory, "images\\error.png"); HttpContext.Current.Response.Clear();

所以我已经实现了压缩文件,但现在我有另一个问题,压缩文件夹包含空文件。压缩的文件大小为0字节

这就是我压缩文件的方式

try
{
    var outPutDirectory = AppDomain.CurrentDomain.BaseDirectory;
    string logoimage = Path.Combine(outPutDirectory, "images\\error.png");

    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, ZipArchiveMode.Create, true))
        {
            var demoFile = zip.CreateEntry(logoimage);
            // add some files to ZIP archive
        }
        ms.WriteTo(HttpContext.Current.Response.OutputStream);
    }

    return true;
}
另一个问题是压缩文件夹的路径与图像的路径相同。所以它就像

ZippFolder/A/B/C/image...
我只需要

ZipFolder/content
这将在ZIP文件中创建一个名为
logoimage
(即
/A/B/C/images/error.png
或任何完整路径)的条目

但您从未写入该条目,因此它是空的。此外,如果您希望有不同的路径,则应在此处指定:

var demoFile = zip.CreateEntry("content\\error.png");
using (StreamWriter writer = new StreamWriter(demoFile.Open()))
using (StreamReader reader = new StreamReader(logoimage))
{
    writer.Write(reader.ReadToEnd());
}
或者,您也可以完全跳过
StreamWriter
,直接写入流:

using (Stream stream = demoFile.Open())
using (StreamReader reader = new StreamReader(logoimage))
{
    reader.BaseStream.CopyTo(stream);
}

顺便说一句,您可以跳过要先在其中写入zip文件的外部
内存流
,然后将该流写入
输出流
。相反,您可以直接写入该流。只需将其传递给
ZipFile
构造函数:

Stream output = HttpContext.Current.Response.OutputStream;
using (ZipArchive zip = new ZipArchive(output, ZipArchiveMode.Create, true))
{
    …
}

嗯,2件事1。您的代码似乎是asp.net,而不是特定于c语言的?2.你正在制作一个很好的内存流,但它从来没有“准备好”或设置为任何内容?我不知道如何编写它。我在这方面是新手,你能举个例子吗?HttpContext听起来像来自asp.net的东西,因此你应该在你的问题中添加这个标签。对于memoryStream,可以使用new memoryStream(),但这只会创建一个空内存流。您没有设置源代码的来源(因为我不知道关于您的项目的更多细节,我不能说您应该如何设置/初始化它)。您应该添加数据的来源。如果它来自文件下载/上传对话框,…现在它来自静态文件。但是整个过程应该是一个web应用程序?难道他不能只是.CopyTo HttpContext.Current.Response.OutputStream吗?与writer不同的是,writer希望将数据放在任何地方,问题在于不将输出放在输出流中。问题是,他希望从HTTP请求返回压缩文件,但他从未将实际内容添加到压缩文件中。我在尝试CopyTo()时遇到此错误。“System.IO.StreamReader”不包含“CopyTo”的定义,并且找不到扩展方法“CopyTo”接受“System.IO.StreamReader”类型的第一个参数(你是否缺少一个using指令或汇编引用?)@poke yepp我知道他从来没有读过任何东西。我的帖子的意思是,最后他想创建zip是的,但他也想将其作为http输出(因为整个事情都应该是下载)。然后他是否需要在streamreader中再次读取演示文件并将其写入输出,或者有更快的方法吗?@ChaudhryMohsinAli是的,抱歉,混淆了这一点。
CopyTo
仅适用于流,不适用于streamreader/Writer
Stream output = HttpContext.Current.Response.OutputStream;
using (ZipArchive zip = new ZipArchive(output, ZipArchiveMode.Create, true))
{
    …
}