对此有很多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}}文件?
答案 0 :(得分:3)
file = File.join(File.dirname(__FILE__), 'test.txt')
File.open(file, 'w') { |f| f.puts 'hello' }
__FILE__
是包含上述代码的文件的路径,因此,test.txt
与write_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
变量是文件句柄,因此您可以将其与write
,print
或puts
一起使用,以将内容发送到文件。它们的行为略有不同,但总的来说,为了您的目的,它们会做同样的事情。
使用带有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类中。)