Ruby:为什么我不能创建新文件?

时间:2016-06-04 14:57:18

标签: ruby

我试图创建一个json文件并写入它。

我的代码如下所示:

def save_as_json(object)
    f = File.new('file.json')
    f.puts(object.to_json, 'w')
    f.close
end

save_as_json({'name'=>'fred'})

问题是,当我运行它时出现以下错误:

:15:in `initialize': No such file or directory @ rb_sysopen - file.json (Errno::ENOENT)

我要求Ruby创建该文件,但它抱怨它不存在!创建和写入文件的正确方法是什么?

2 个答案:

答案 0 :(得分:5)

您只需要使用'w'模式打开文件,如下所示:

f = File.new('file.json', 'w')

您希望根据计划对文件执行的操作来确定模式,但以下是您的选择:

  

“r”只读,从文件开头(默认模式)开始。

     

“r +”读写,从文件开头开始。

     

“w”只写,截断现有文件        为零长度或创建一个新文件进行写作。

     

“w +”读写,将现有文件截断为零长度        或创建一个新的文件进行阅读和写作。

     

“a”只写,每次写入调用都会在文件末尾附加数据。        如果文件不存在,则创建一个用于写入的新文件。

     

“a +”读写,每次写入调用都会在文件末尾附加数据。        如果文件有,则创建一个用于读写的新文件        不存在。

IO Docs

答案 1 :(得分:2)

文件创建默认为读取模式,因此尝试使用不存在的filespec会导致错误:

2.3.0 :001 > f = File.new 'foo'
Errno::ENOENT: No such file or directory @ rb_sysopen - foo

您需要指定'w':

2.3.0 :002 > f = File.new 'foo', 'w'
 => #<File:foo>

也就是说,使用File.newFile.open编写文件比使用文件句柄更容易。 Ruby中最简单的方法是调用File.write

File.write('file.json', object.to_json)

如果需要,您可以使用更长的File.open方法;如果你这样做,最简单的方法是将一个块传递给File.open:

File.open('file.json', 'w') { |f| f << object.to_json }

这使您无需显式关闭文件; File.open,当传递一个块时,在块执行完毕后为你关闭文件。