我对系统相当陌生。IO流,因此不完全确定何时以及如何使用不同的流。
让我解释一下我的用例:
目前,我有一个安装了FileStream的MS SQL数据库,其中存储了文件的FileName
、Byte[]
和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文件中。