如何在Ruby中创建文件

Civ*_*rix 160 ruby io file errno

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

File.new "out.txt"
File.open "out.txt"
File.new "out.txt","w"
File.open "out.txt","w"
Run Code Online (Sandbox Code Playgroud)

根据我在网上阅读的所有内容,所有这些都应该有效但是每一个都给我这个:

ERRNO::ENOENT: No such file or directory - out.txt
Run Code Online (Sandbox Code Playgroud)

这发生在IRB以及ruby文件中.我错过了什么?

zan*_*bri 410

使用:

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

您的选择是:

  • r- 只读.该文件必须存在.
  • w - 创建一个空文件进行写入.
  • a - 附加到文件.如果文件不存在,则创建该文件.
  • r+ - 打开文件以更新读取和写入.该文件必须存在.
  • w+ - 为读取和写入创建一个空文件.
  • a+ - 打开文件进行阅读和追加.如果文件不存在,则创建该文件.

在你的情况下,'w'是优选的.

或者你可以:

out_file = File.new("out.txt", "w")
#...
out_file.puts("write your stuff here")
#...
out_file.close
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案.Ruby conevntion是var的名字的蛇案例.只是一个新手的头.`outFile`应该看起来像`out_file`. (8认同)
  • @AdamWaite我根据你的snake_case建议编辑了答案,留下了这个评论的上下文. (3认同)
  • @zanbri - 如果我不关闭文件会怎么样? (3认同)
  • @BoratSagdiyev"不再引用的File对象有资格进行垃圾回收.当File对象被垃圾回收时,文件将自动关闭." http://www.rootr.net/rubyfaq-9.html (2认同)
  • @jkdev,是的,它将被关闭,但依赖它仍然被认为是代码味道,就像程序员从未关闭文件并在解释器终止时让操作系统关闭文件一样。如果打开多个文件并且代码永远不会关闭它们,从而导致无法处理的情况和错误,则两者都可能导致严重错误。故意关闭它们或依赖自动执行此操作的块只是一种更好、更安全的做法。 (2认同)

GMD*_*GMD 34

尝试

File.open("out.txt", "w") do |f|     
  f.write(data_you_want_to_write)   
end
Run Code Online (Sandbox Code Playgroud)

没有使用

File.new "out.txt"
Run Code Online (Sandbox Code Playgroud)


Chr*_*nch 24

尝试使用w+写入模式而不仅仅是w:

File.open("out.txt", "w+") { |file| file.write("boo!") }
Run Code Online (Sandbox Code Playgroud)

  • 如果你只想写(`w`)或同时读写(`w +`),则取决于你. (4认同)

tom*_*tom 20

好的,现在我觉得很蠢.前两个肯定不起作用,但后两个起作用.不知道我是如何说服自己的,我曾尝试过这些.很抱歉浪费每个人的时间.

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


nte*_*rry 11

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

我不久就遇到了这个问题.


the*_*Man 8

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

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

File.open('foo.txt', 'w') { |fo| fo.puts "bar" }
Run Code Online (Sandbox Code Playgroud)

或者更糟:

fo = File.open('foo.txt', 'w')
fo.puts "bar"
fo.close
Run Code Online (Sandbox Code Playgroud)

使用更简洁write:

File.write('foo.txt', 'bar')
Run Code Online (Sandbox Code Playgroud)

write我们可以使用模式,如有必要'w',我们可以使用.'a''r+'

open如果您必须在迭代循环中计算输出并希望在执行此操作时保持文件处于打开状态,则使用块是有用的.write如果要在一个blast中输出内容然后关闭文件,则非常有用.

有关更多信息,请参阅文档.


Nic*_*tti 5

如果目标只是创建文件,那么我看到的最直接的方法是:

 FileUtils.touch "foobar.txt"
Run Code Online (Sandbox Code Playgroud)