Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将多个文件压缩到内存流中_C#_Memorystream_Ziparchive - Fatal编程技术网

C# 将多个文件压缩到内存流中

C# 将多个文件压缩到内存流中,c#,memorystream,ziparchive,C#,Memorystream,Ziparchive,我已经研究过类似问题的答案,但还没有看到将多个文件收集到一个ziparchive中进行传输下载的问题。以下内容没有给出任何错误,但不会返回可识别的zip文件 public async Task<HttpResponseMessage> SendAZipOfFiles() { var memoryStream = new MemoryStream(); var response = new HttpResponseMessage(HttpStatusCode.O

我已经研究过类似问题的答案,但还没有看到将多个文件收集到一个ziparchive中进行传输下载的问题。以下内容没有给出任何错误,但不会返回可识别的zip文件

public async Task<HttpResponseMessage> SendAZipOfFiles()
{
      var memoryStream = new MemoryStream();
      var response = new HttpResponseMessage(HttpStatusCode.OK);

      List<string> filepaths = await GetSomeFiles();
      using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
      {
          foreach (string filepath in filepaths)
          {
               string filename = Path.GetFileName(filepath);
               using (StreamReader reader = new StreamReader(filepath))
               using (StreamWriter writer = new StreamWriter(archive.CreateEntry(filename).Open()))
               {
                    writer.Write(reader.ReadToEnd());
               }
          }
      }
      memoryStream.Position = 0;
      response.Content = new StreamContent(memoryStream);
      response.Content.Headers.ContentLength = memoryStream.Length;
      response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
      {
          FileName = "TheFile.zip")
      };
      response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
     return response;
}
公共异步任务SendAZipOfFiles()
{
var memoryStream=新的memoryStream();
var响应=新的HttpResponseMessage(HttpStatusCode.OK);
List filepath=await GetSomeFiles();
使用(var archive=new ZipArchive(memoryStream,ZipArchiveMode.Create,true))
{
foreach(文件路径中的字符串文件路径)
{
字符串filename=Path.GetFileName(filepath);
使用(StreamReader=新StreamReader(文件路径))
使用(StreamWriter writer=newstreamwriter(archive.CreateEntry(filename.Open()))
{
writer.Write(reader.ReadToEnd());
}
}
}
memoryStream.Position=0;
response.Content=新的流内容(memoryStream);
response.Content.Headers.ContentLength=memoryStream.Length;
response.Content.Headers.ContentDisposition=新的ContentDispositionHeaderValue(“附件”)
{
FileName=“TheFile.zip”)
};
response.Content.Headers.ContentType=新的MediaTypeHeaderValue(“应用程序/zip”);
返回响应;
}

我看到您正在使用
StreamReader
StreamWriter
,这两种方法不仅对您的目的没有用处,而且可能会产生编码问题,因为它们专门用于读取和写入文本文件

如果您需要向存档中添加任何类型的文件,而不仅仅是纯文本文件,则在读/写时可能会损坏数据

相反,只需将原始流复制到存档条目:

public async Task<HttpResponseMessage> SendAZipOfFiles()
{
    var memoryStream = new MemoryStream();
    var response = new HttpResponseMessage(HttpStatusCode.OK);

    List<string> filepaths = await GetSomeFiles();
    using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
    {
        foreach (string filepath in filepaths)
        {
             string filename = Path.GetFileName(filepath);
             var entry = archive.CreateEntry(filename);
             using (var file = File.OpenRead(filename))
             using (var entryStream = entry.Open())
             {
                  await file.CopyToAsync(entryStream);
             }
        }
    }
    memoryStream.Position = 0;
    response.Content = new StreamContent(memoryStream);
    response.Content.Headers.ContentLength = memoryStream.Length;
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
    {
        FileName = "TheFile.zip")
    };
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
    return response;
}
公共异步任务SendAZipOfFiles()
{
var memoryStream=新的memoryStream();
var响应=新的HttpResponseMessage(HttpStatusCode.OK);
List filepath=await GetSomeFiles();
使用(var archive=new ZipArchive(memoryStream,ZipArchiveMode.Create,true))
{
foreach(文件路径中的字符串文件路径)
{
字符串filename=Path.GetFileName(filepath);
var entry=archive.CreateEntry(文件名);
使用(var file=file.OpenRead(文件名))
使用(var entryStream=entry.Open())
{
wait file.CopyToAsync(entryStream);
}
}
}
memoryStream.Position=0;
response.Content=新的流内容(memoryStream);
response.Content.Headers.ContentLength=memoryStream.Length;
response.Content.Headers.ContentDisposition=新的ContentDispositionHeaderValue(“附件”)
{
FileName=“TheFile.zip”)
};
response.Content.Headers.ContentType=新的MediaTypeHeaderValue(“应用程序/zip”);
返回响应;
}

我看到您正在使用
StreamReader
StreamWriter
,这两种方法不仅对您的目的没有用处,而且可能会产生编码问题,因为它们专门用于读取和写入文本文件

如果您需要向存档中添加任何类型的文件,而不仅仅是纯文本文件,则在读/写时可能会损坏数据

相反,只需将原始流复制到存档条目:

public async Task<HttpResponseMessage> SendAZipOfFiles()
{
    var memoryStream = new MemoryStream();
    var response = new HttpResponseMessage(HttpStatusCode.OK);

    List<string> filepaths = await GetSomeFiles();
    using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
    {
        foreach (string filepath in filepaths)
        {
             string filename = Path.GetFileName(filepath);
             var entry = archive.CreateEntry(filename);
             using (var file = File.OpenRead(filename))
             using (var entryStream = entry.Open())
             {
                  await file.CopyToAsync(entryStream);
             }
        }
    }
    memoryStream.Position = 0;
    response.Content = new StreamContent(memoryStream);
    response.Content.Headers.ContentLength = memoryStream.Length;
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
    {
        FileName = "TheFile.zip")
    };
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
    return response;
}
公共异步任务SendAZipOfFiles()
{
var memoryStream=新的memoryStream();
var响应=新的HttpResponseMessage(HttpStatusCode.OK);
List filepath=await GetSomeFiles();
使用(var archive=new ZipArchive(memoryStream,ZipArchiveMode.Create,true))
{
foreach(文件路径中的字符串文件路径)
{
字符串filename=Path.GetFileName(filepath);
var entry=archive.CreateEntry(文件名);
使用(var file=file.OpenRead(文件名))
使用(var entryStream=entry.Open())
{
wait file.CopyToAsync(entryStream);
}
}
}
memoryStream.Position=0;
response.Content=新的流内容(memoryStream);
response.Content.Headers.ContentLength=memoryStream.Length;
response.Content.Headers.ContentDisposition=新的ContentDispositionHeaderValue(“附件”)
{
FileName=“TheFile.zip”)
};
response.Content.Headers.ContentType=新的MediaTypeHeaderValue(“应用程序/zip”);
返回响应;
}

原来我的问题出在打字脚本方面

我确实更改了代码,替换了:

string filename = Path.GetFileName(filepath);
using (StreamReader reader = new StreamReader(filepath))
using (StreamWriter writer = new 
StreamWriter(archive.CreateEntry(filename).Open()))
{
    writer.Write(reader.ReadToEnd());
}
使用更简单的:

archive.CreateEntryFromFile(filepath, Path.GetFileName(filepath));

结果发现我的问题出在打字方面

我确实更改了代码,替换了:

string filename = Path.GetFileName(filepath);
using (StreamReader reader = new StreamReader(filepath))
using (StreamWriter writer = new 
StreamWriter(archive.CreateEntry(filename).Open()))
{
    writer.Write(reader.ReadToEnd());
}
使用更简单的:

archive.CreateEntryFromFile(filepath, Path.GetFileName(filepath));

但是当你将拉链部分作为一个单独的方法进行分解时,它就变得更容易进行(单元)测试了。旁注,但是当你将拉链部分作为一个单独的方法进行分解时,它就变得更容易进行(单元)测试了。