使用系统.IO.MemoryStream可以处理相对较大的zip存档



我对系统相当陌生。IO流,因此不完全确定何时以及如何使用不同的流。

让我解释一下我的用例:

目前,我有一个安装了FileStream的MS SQL数据库,其中存储了文件的FileNameByte[]Section。即

public partial class MyFiles {
public int Id { get; set; }
public int Section { get; set; } 
public string FileName { get; set; }
public byte[] Data { get; set; }
}

在某个时刻,我希望能够下载属于特定部分的所有文件。因此,我想:

  • 查询特定于某个节的文件
  • 写入ZipArchive
  • 将压缩文件作为FileContentResult传递

我决定使用MemoryStream来实现这一点,因为它既快速又方便,我不必在服务器上使用文件系统。实现如下:

MemoryStream stream;
using (stream = new MemoryStream())
{
using (var zipArchive = new ZipArchive(stream, ZipArchiveMode.Create))
{
foreach (MyFiles file in fetchedFiles)
{
var fileEntry = zipArchive.CreateEntry(file.FileName);
using (var entryStream = fileEntry.Open())
{
entryStream.Write(file.Data, 0, file.Data.Length);
}
}
}
}
return new SuccessResult<MemoryStream>(stream);

一切正常,我可以成功地检索我的压缩文件。。

然而,现在我开始怀疑这个实现,因为它可能最终处理的文件加起来可以达到512MB-1GB。。

服务器确实很强大,但显然我不想在这个过程中消耗所有内存。

我是否在MemoryStream上走错了方向?理想情况下我应该考虑其他事情吗?

需要考虑的另一件事是,您实际上在内存中有两次文件——一次是在fetchedFiles&然后再次在zip文件中。

理想情况下,您需要将文件从DB流式传输到输出流,或者实际上是zip文件。

与其获取所有文件然后将其添加到zip中,不如打开zip文件,然后将每个文件流式传输到zip文件中。

最新更新