生成没有内存流的文件和ZIP

时间:2016-05-04 13:29:36

标签: c#

我正在寻找一种在没有内存流的情况下将文件存储在zip文件中的方法。我的目标是节省最多的系统内存,而直接磁盘IO没问题。 我迭代了一个数据库结果集,我收集了一些blob。这些是字节数组。

我在下面做了什么(System.IO.Compression):

using (var archive = ZipFile.Open("data.zip", ZipArchiveMode.Update))
    {
    foreach (var result in results)
    {
        string fileName = $"{result.Id}.bin";

        using (var fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write))
        {
            // write the blob data from result.Value
            fileStream.Write(result.Value, 0, result.Value.Length);
            fileStream.Close();
        }
        archive.CreateEntryFromFile(fileName, fileName);
    }
}

此实施有两个问题。

  1. 我有* .bin文件和一个* .zip(只需要拉链)
  2. 我不知道为什么,但这会占用大量内存(15x1.5MB bin文件大约100MB)
  3. 有没有办法彻底禁止记忆?

    更新:

    我想要实现的是生成一个ZIP文件,其中包含从数据库blob生成的单个二进制文件。这应该发生在ASP.NET Web API控制器中。用户可以请求数据,但不是在HTTP响应中发送整个数据,而是在请求时生成ZIP文件,将其保存到本地文件服务器并将下载链接发送回用户。

1 个答案:

答案 0 :(得分:-1)

我认为您的> 100 MB来自

  1. 应包含至少15x1.5 MB blob数据的results对象
  2. 将结果data.zip保存在foreach Scope内。
  3. 最小化工作进程的RAM量:

    create empty zip-file
    do {
     (single BLOB query from DB)
     (write blob to new or overwrite File)
     (open zip file for append)
     (append file to zip)
     (close and dispose **both** file handles / objects )
    }