Ruby - 在内存中创建文件

Posted

技术标签:

【中文标题】Ruby - 在内存中创建文件【英文标题】:Ruby - Creating a file in memory 【发布时间】:2013-01-07 11:10:23 【问题描述】:

在不将文件写入磁盘的情况下,是否可以在 Ruby 中编写以下代码?

temp_file = 'path/to/file.csv'
users = [a@b.c, c@b.a]

CSV.open(temp_file, "w") do |csv|
  csv << data_for_report
end

Reports.sendreport users temp_file

File.delete(temp_file)

Reports.sendreport 附加一个文件并发送电子邮件,所以它需要是一个文件...

【问题讨论】:

所以你想要一串逗号分隔的值?那时你需要 csv 吗?你能用逗号连接你的列,用换行符连接你的行吗? 哦,sendreport 函数发送一封带有 csv 文件的邮件。所以我真的需要它成为一个文件...... 你是说sendreport方法从磁盘读取文件? 正确.. 它从光盘中读取文件并将其附加到电子邮件中。现在的问题是,是否有办法将文件作为文件保存在内存中。 如果您无法更改Reports,那么您可能正在以正确的方式进行操作。获得一段内存来假装它是一个磁盘,这样Reports 可以从中读取,这可能比它的价值更麻烦。 【参考方案1】:
temp_file = CSV.generate do |csv|
  csv << data_for_report
end

Reports.sendreport users temp_file

【讨论】:

【参考方案2】:

如果您的代码将使用文件指针/句柄而不是您当前的代码,那么您可以执行以下操作:

require 'csv'
require 'stringio'

data_for_report = [1,2,3,4]
temp_file = StringIO.new # creates a fake file as string.

CSV.new(temp_file, "w") do |csv|
  csv << data_for_report
end

它不适用于您的用例的关键问题是Reports.report users temp_file 这一行

如果它接受句柄而不是字符串,它将起作用。

另请参阅此 SO:https://***.com/a/19110958/887836

【讨论】:

【参考方案3】:

您可以使用TempfileTempfile 将文件写入光盘,因此不符合您的要求。

但我认为 Tempfile 提供了一些你需要的功能:

当一个 Tempfile 对象被垃圾回收,或者当 Ruby 解释器退出时,它相关的临时文件会被自动删除。

例子:

require 'tempfile'
require 'csv'

data_for_report = [1,2,3,4]
temp_file = Tempfile.new('foo')

CSV.open(temp_file, "w") do |csv|
  csv << data_for_report
end

【讨论】:

又近了一步。。谢谢! 请注意,它是Tempfile,而不是TempFile Ruby 文档的链接已损坏【参考方案4】:

试试其中一种 mmap 宝石。如果库采用文件名,那是您的选择。

但是,如果它可以接受类似文件的对象,则可以使用 StringIO。

您可以考虑更改 Reports 的任何内容,使其更通用。这取决于它使用什么来创建它的邮件消息——这可能是微不足道的。

【讨论】:

我将研究 StringIO,认为这可能是我正在寻找的... Reports.sendreport 实际上只是我自己对 gmail gem 的包装,所以我不确定我是否需要一个如果或如果 StringIO 将起作用,则为真实。

以上是关于Ruby - 在内存中创建文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ruby 中创建 JSON 对象

在 ruby​​ 中为谷歌驱动器文件创建编辑链接

Python Django:在内存中创建文件对象而不实际创建文件

在内存中创建一个 Zip 文件

如何在内存中创建一个文件供用户下载,而不是通过服务器?

如何在内存中创建一个文件供用户下载,而不是通过服务器?