如何在Ruby中创建文件


170

我正在尝试创建一个新文件,但事情似乎也没有按我期望的那样工作。这是我尝试过的:

File.new "out.txt"
File.open "out.txt"
File.new "out.txt","w"
File.open "out.txt","w"

根据我在网上阅读的所有内容,所有这些都应该起作用,但是其中每一个都会给我以下信息:

ERRNO::ENOENT: No such file or directory - out.txt

这发生在IRB和Ruby脚本中。我想念什么?


13
前两个应该不起作用,但是后两个是同义词,绝对可以起作用。
安德鲁·马歇尔

@Andrew:您正在考虑只尝试了前两个吗?
亩太短了,

1
@muistooshort这是我唯一能得出的结论。会抛出一个权限错误Errno::EACCES,而不是ENOENT
安德鲁·马歇尔

2
好,现在我觉得很蠢。前两个肯定不起作用,但是后两个却起作用。不知道我如何说服自己尝试过它们。很抱歉浪费大家的时间。
Civatrix

1
@Civatrix没问题。有时我们都浪费时间。
Darth Egregious

Answers:


434

用:

File.open("out.txt", [your-option-string]) {|f| f.write("write your stuff here") }

您的选择在哪里:

  • r- 只读。该文件必须存在。
  • w -创建一个空文件进行写入。
  • a -附加到文件。如果文件不存在,则创建该文件。
  • r+-打开文件以同时更新读取和写入。该文件必须存在。
  • w+ -创建一个用于读取和写入的空文件。
  • a+-打开文件进行读取和附加。如果文件不存在,则创建该文件。

以您的情况'w'为佳。

否则,您可能会:

out_file = File.new("out.txt", "w")
#...
out_file.puts("write your stuff here")
#...
out_file.close

11
好答案。Ruby convntion是var名称的蛇形情况。只是对新手的注意。outFile应该看起来像out_file
亚当·怀特

3
@AdamWaite我已根据您的snake_case建议编辑了答案,此注释仅供参考。
克里斯,

3
@zanbri-如果我不关闭文件怎么办?
Erran Morad 2014年

1
好的答案,全面而简短
Boris 2014年

2
“ @BoratSagdiyev”不再引用的File对象将有资格进行垃圾回收。当File对象被垃圾回收时,该文件将自动关闭。rootr.net/rubyfaq-9.html
jkdev

35

尝试

File.open("out.txt", "w") do |f|     
  f.write(data_you_want_to_write)   
end

不使用

File.new "out.txt"

25

尝试将其"w+"用作写入模式,而不仅仅是"w"

File.open("out.txt", "w+") { |file| file.write("boo!") }

4
取决于您只想写(w)还是要读和写(w+)。
jkdev

20

好,现在我觉得很蠢。前两个肯定不起作用,但是后两个却起作用。不知道我如何说服自己尝试过它们。很抱歉浪费大家的时间。

如果这对其他人有帮助,则当您尝试在不存在的目录中创建新文件时可能会发生这种情况。


11

该目录不存在。确保它存在,因为open不会为您创建这些目录。

我前一段时间碰到了这个。


11

File.newFile.open默认将其设为读取模式('r')作为一种安全机制,以避免可能会覆盖文件。'w'如果要输出到文件,我们必须明确地告诉Ruby使用写模式(这是最常见的方式)。

如果要输出的文本是字符串,而不是写:

File.open('foo.txt', 'w') { |fo| fo.puts "bar" }

或更糟的是:

fo = File.open('foo.txt', 'w')
fo.puts "bar"
fo.close

使用更简洁的方法write

File.write('foo.txt', 'bar')

write已经允许的模式,所以我们可以使用'w''a''r+'如果需要的话。

open如果必须在迭代循环中计算输出并希望在执行操作时使文件保持打开状态,则带有块的功能很有用。write如果要一次性输出内容然后关闭文件,此功能很有用。

有关更多信息,请参见文档


很好的回应,这是最惯用的方式,因此也是“ Rubyist”方式。应该是最佳答案。
吉诺(Gino)

好吧,我同意。我很少使用块形式来写入文件。视觉上太吵了。
锡人


1
data = 'data you want inside the file'.

您可以使用 File.write('name of file here', data)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.