【问题标题】:Ruby writing to a file in memory (not actually writing to it)Ruby 写入内存中的文件(实际上并未写入)
【发布时间】:2024-01-15 11:15:01
【问题描述】:

所以我有这个程序可以传递一个字符串(这个字符串是它应该读取的文件的路径)

现在我有一个必须打开该文件的方法。使用 Gsub 更改文本,然后再次输出该文件(无法编辑原始文件),但我最终需要输出更改后的文件

这是我用来更改文件的方法(简化)

def self.changeFile(myfile)
myfile = @path

doc = File.open(myfile)
text = doc.read

text.gsub!("change" , "changed")

return text

问题是我将整个文件作为字符串返回。我的其他方法使用“字符串”路径名的输入

所以我的问题是无论如何我可以将我的文本写入我在内存中更改的文件,所以实际上不更改原始文件?

我在考虑使用“Tempfile”或“StringIO”,但我不知道这样做是否正确

感谢所有帮助

【问题讨论】:

  • 您要创建另一个文件,其中包含原始文件中更改的文本吗?如果是这样,您想将其设为临时文件还是普通文件?
  • @Maxim Pontyushenko 是的,我想用整个新文件(已更改的文件)创建一个文件,但我不想写
  • 我的其他方法使用“字符串”路径名的输入——这排除了 StringIO,因为 StringIO 没有路径名。 但我不想写--要创建文件,您必须写入文件。 Tempfile 只是为文件创建一个不会与任何现有文件名冲突的名称。如果您想在完成所有更改并打印出文件后删除 Tempfile,那么这就是要走的路。否则,您可以创建一个与原始文件同名的新文件,并在文件名末尾添加“已更改”之类的内容。但是....
  • ...这最终可能会覆盖现有文件。为避免这种情况,您可以创建一个新目录并将新文件添加到其中。

标签: ruby memory temporary-files stringio


【解决方案1】:

您可以为此使用寺庙:

def self.changeFile(myfile)
  myfile = @path
  tempfile = Tempfile.new("changed")
  tempfile << File.open(myfile).read.gsub("change" , "changed")
  tempfile.close
  tempfile.path
end

【讨论】:

  • 我是否会“返回临时文件”而不是在其他方法中使用临时文件?
  • @FroggyFreshh 您不需要使用return,因为最后一行是 ruby​​ 方法中默认返回的内容。所以你会有临时文件路径作为这个方法的返回值。
  • 当心 - 当临时文件被垃圾收集时文件将被删除 - 这可能随时发生
  • @FrederickCheung 是的。
最近更新 更多