【问题标题】:How to create zip file only in memory in ruby?如何在 ruby​​ 中仅在内存中创建 zip 文件?
【发布时间】:2012-07-17 23:55:20
【问题描述】:

我想在给定目录中创建一个包含所有 HTML 文件的 zip 文件。 zip 将作为附件通过电子邮件与目录中的其余文件一起发送。到目前为止,如果我从小马发送任何附件是 HTML 文件,我尝试的所有电子邮件客户端都无法阅读电子邮件。所以我想我会把它们拉上拉链。

有什么方法可以压缩 HTML 动态文件,但实际上只在内存中,而不使用任何临时文件Windows 平台?最好不要使用任何外部程序?

如果我理解正确,这两种方法都描述在:

正在使用某种临时文件。

【问题讨论】:

  • 为什么临时文件不受欢迎?通常在幕后使用它们进行临时存储。
  • 如果我不能只在内存中使用临时文件,这是一个选项。可以使用临时文件,但我不喜欢。
  • 临时文件之所以有利的原因是在存档增长到足以影响 RAM 的情况下。假脱机到临时文件将使机器运行更长时间,因为与消耗所有可用 RAM 相比,它消耗所有可用磁盘空间的可能性要小得多。如果您使用的计算机可用 RAM 很少,请认真考虑临时文件。
  • 反之亦然。 zip 将主要只包含两个小的 HTML 文件。所以我认为在内存中做所有事情会更容易更快。
  • 对于一个小的 zip,在考虑缓冲后它会稍微快一些。我怀疑你会注意到很多不同。

标签: ruby rubygems zip rubyzip


【解决方案1】:

起初我想也许你可以使用 StringIO 对象来写入,但看起来 ZipOutputStream 类坚持要打开一个临时文件。

如果您不介意调用外部程序,可以通过使用“-”而不是文件名来告诉标准 linux zip 将 otuput 发送到 stdout 而不是文件。所以只需将输出收集到一个变量中,然后对它做任何你喜欢的事情。

zipdata = %x(zip -q - *.html)

我认为这不会比仅使用临时文件提高效率,但您必须对其进行测量才能确定。

【讨论】:

  • 对不起,我没有提到我在 Windows 上。不过我喜欢你的方法。
猜你喜欢
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 2014-06-30
  • 2012-11-23
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多