如何在Ruby中创建文件

如何在Ruby中创建文件,ruby,file,io,errno,Ruby,File,Io,Errno,我正在尝试创建一个新文件,但事情似乎也不像我预期的那样正常。以下是我尝试过的: 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脚本实现。我错过了什么?试试看

我正在尝试创建一个新文件,但事情似乎也不像我预期的那样正常。以下是我尝试过的:

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脚本实现。我错过了什么?

试试看

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

File.new "out.txt"
尝试使用
“w+”
作为写入模式,而不仅仅是
“w”

使用:

您的选择是:

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

或者你可以:

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

好吧,现在我觉得自己很愚蠢。前两个肯定不起作用,但后两个起作用。我不知道我是如何说服自己我已经试过了。对不起,浪费了大家的时间


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

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


不久前我自己也遇到过这个问题。

您也可以使用常量而不是字符串来指定所需的模式。这样做的好处是,如果您在常量名称中输入错误,您的程序将引发运行时异常

常量是
File::RDONLY
File::WRONLY
File::CREAT
。如果你愿意,你也可以把它们结合起来


文件。新建
文件。打开
作为安全机制的默认读取模式(
'r'
),以避免可能覆盖文件。如果要输出到文件,我们必须明确地告诉Ruby使用写模式(
'w'
是最常见的方式)

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

File.open('foo.txt', 'w') { |fo| fo.puts "bar" }
或者更糟:

fo = File.open('foo.txt', 'w')
fo.puts "bar"
fo.close
使用更简洁的
编写

File.write('foo.txt', 'bar')
write
具有允许的模式,因此我们可以在必要时使用
'w'
'a'
'r+'

open
如果您必须在迭代循环中计算输出,并且希望在执行此操作时保持文件打开,则使用块打开是非常有用的<如果要在一次爆炸中输出内容,然后关闭文件,则代码>写入非常有用


有关更多信息,请参阅。

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

 FileUtils.touch "foobar.txt"

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

前两个不应该起作用,但后两个是同义词,绝对应该起作用。@安德鲁:你认为只有前两个被试过吗?@muistooshort这是我能得出的唯一结论。权限错误会抛出
Errno::EACCES
,而不是
enoint
。好吧,现在我觉得自己很愚蠢。前两个肯定不起作用,但后两个起作用。我不知道我是如何说服自己我已经试过了。很抱歉浪费了大家的时间。@Civatrix没问题。我们有时都会浪费时间。回答得很好。Ruby conevntion是变量名的蛇形结构。只是给新手一个提醒<代码>输出文件看起来应该像
输出文件
@AdamWaite我根据你的snake案例建议编辑了答案,将此评论留待上下文。@zanbri-如果我不关闭文件会发生什么?@BoratSagdiyev“不再被引用的文件对象符合垃圾收集的条件。当文件对象被垃圾回收时,文件将自动关闭。“@jkdev,是的,它将被关闭,但它仍然被认为是依赖于代码气味,就像程序员从未关闭文件,并让操作系统在解释器终止时关闭文件一样。如果打开多个文件,并且代码从未关闭它们,这两种情况都可能导致错误,从而导致失控情况和错误。故意关闭它们或依赖自动关闭的块是更好、更安全的做法。这取决于您是只写(
w
)还是同时读写(
w+
)。反应很好,这是最惯用的方式,因此是“Rubyist”方式。应该是最重要的答案,我同意。我很少使用块表单来编写文件。太吵了。
File.write('foo.txt', 'bar')
 FileUtils.touch "foobar.txt"
data = 'data you want inside the file'.