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】:您可以使用Tempfile
。
Tempfile
将文件写入光盘,因此不符合您的要求。
但我认为 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 - 在内存中创建文件的主要内容,如果未能解决你的问题,请参考以下文章