如何在Ruby中写入文件?

时间:2013-12-26 20:46:47

标签: ruby file

对此有很多SO答案,例如“How to write to file in Ruby?”,但我错过了一个path to file点:

我有这样的文件结构:

├── test.txt
├── write_to_file.rb

和“write_to_file.rb”具有以下内容:

 File.open('test.txt', 'w') { |file| file.write('hello') }
 # tried ('./test.txt','w') ..as well.

如何将一些内容写入另一个test.txt的{​​{1}}文件?

2 个答案:

答案 0 :(得分:3)

正确的方法:

file = File.join(File.dirname(__FILE__), 'test.txt')
File.open(file, 'w') { |f| f.puts 'hello' }

__FILE__是包含上述代码的文件的路径,因此,test.txtwrite_to_file.rb位于同一目录中,无论您是哪个目录,这都应该有效在你的机器上。

另请注意,我使用puts方法而不是write,因为我更喜欢新行。 :)


你的代码有什么问题(可能):

使用test.txt时,路径相对于运行write_to_file.rb脚本的目录。例如,如果您从主目录运行write_to_file.rb,那么test.txt将暗示~/test.txt

答案 1 :(得分:0)

编写内容的简单方法是:

content = 'stuff to write'
File.write('text.txt', content)

这将用新内容覆盖该文件。

一种更复杂的方式,它可以让您更好地控制文件内容(无论是文本还是二进制文件):

File.open('text.txt', 'w') do |fo|
  fo.write(content)
end

这完成了同样的事情。文件模式w告诉Ruby写。 wb会告诉Ruby编写二进制内容。不同之处在于在写入文件期间如何处理/转换行尾。与许多其他语言一样,Ruby意识到Windows需要与* nix系统不同的行结束,并在编写文本时进行相应调整。使用“二进制”模式不会导致行结束转换。

在块中,fo变量是文件句柄,因此您可以将其与writeprintputs一起使用,以将内容发送到文件。它们的行为略有不同,但总的来说,为了您的目的,它们会做同样的事情。

使用带有open的块告诉Ruby在写入块之后关闭文件,当块退出时。始终在尽可能短的时间内打开和关闭文件。操作系统具有有限数量的文件句柄,并且将它们打开可能会不必要地使用它们,因此其他应用程序无法使用它们。

您需要了解操作系统如何指定资源/文件的路径。

'text.txt''./text.txt'相同,这意味着它位于当前目录中。

使用'../text.txt'表示它位于父目录中,'..'表示它是相对路径。同样地,'subdir/text.txt'意味着“text.txt”位于子目录中。

使用'/path/to/text.txt'表示它是一个绝对路径,从磁盘的根开始,你必须查看'path'目录,然后是'to'子目录,会在那里找到“text.txt”。

IO class documentation涵盖了这一点。 (并且,在您提出要求之前,File继承自IO,因此IO中的所有可用内容都自动在File类中。)