【问题标题】:Ruby: Why can't I create a new file?Ruby:为什么我不能创建一个新文件?
【发布时间】:2016-06-04 14:57:18
【问题描述】:

我正在尝试创建一个 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 创建文件,但它抱怨它不存在!创建和写入文件的正确方法是什么?

【问题讨论】:

  • 试试File.write( "file.json", object.to_json )。这将截断现有文件或创建一个新文件(如果不存在),将内容写入其中并关闭文件。
  • 有时这是一个路径问题。将您的文件路径与您认为的文件路径进行比较: File.expand_path('my_file.rb')

标签: ruby


【解决方案1】:

你只需要像这样使用'w'模式打开文件:

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

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

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

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

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

"w+" 读写,将现有文件截断为零长度 或者创建一个新的文件进行读写。

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

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

IO Docs

【讨论】:

    【解决方案2】:

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

    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,当传递一个块时,在块执行完成后为你关闭文件。

    【讨论】:

    • 没有块 File.open 与 File.new 相同。 ruby-doc.org/core-2.3.0/File.html#method-c-open
    • 哇,你说得对,我早该知道的。我会改变我的答案以反映这一点。对不起...
    • 请注意,对于像 File.write 这样简单的调用,不再需要编写单独的包装方法来执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多