189

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

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

4

9 回答 9

467

采用:

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
于 2011-10-27T12:33:45.093 回答
38

尝试

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

不使用

File.new "out.txt"
于 2011-10-27T04:31:39.690 回答
29

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

File.open("out.txt", "w+") { |file| file.write("boo!") }
于 2011-10-27T05:40:31.147 回答
21

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

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

于 2012-07-10T21:43:37.307 回答
14

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

 FileUtils.touch "foobar.txt"
于 2019-02-26T07:43:44.657 回答
11

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

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

于 2014-12-09T03:24:21.353 回答
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如果您必须在迭代循环中计算输出并希望在执行此操作时使文件保持打开状态,则 with a block 很有用。write如果您要一次性输出内容然后关闭文件,这很有用。

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

于 2017-05-09T18:58:52.437 回答
3
data = 'data you want inside the file'.

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

于 2020-02-21T03:09:17.587 回答
0

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

常数是File::RDONLYorFile::WRONLYFile::CREAT。如果您愿意,也可以将它们组合起来。

ruby-doc.org 上文件打开模式的完整描述

于 2015-11-18T22:18:47.933 回答