【问题标题】:How to create a file in Ruby如何在 Ruby 中创建文件
【发布时间】:2011-12-16 05:38:40
【问题描述】:

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

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

【问题讨论】:

  • 前两个不应该工作,但后两个是同义词,绝对应该工作。
  • @Andrew:你认为只尝试了前两个?
  • @muistooshort 这是我能得出的唯一结论。权限错误会抛出Errno::EACCES,而不是ENOENT
  • 好吧,现在我觉得自己很愚蠢。前两个肯定不行,但后两个可以。不知道我是如何说服自己我已经尝试过的。很抱歉浪费了大家的时间。
  • @Civatrix 没问题。有时我们都会浪费时间。

标签: ruby file io errno


【解决方案1】:

试试

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

不使用

File.new "out.txt"

【讨论】:

    【解决方案2】:

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

    File.open("out.txt", "w+") { |file| file.write("boo!") }
    

    【讨论】:

    • 取决于你是想只写 (w) 还是同时读写 (w+)。
    【解决方案3】:

    用途:

    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
    

    【讨论】:

    • 很好的答案。 Ruby conevntion 是 var 名称的蛇形案例。只是给新手一个提示。 outFile 应该看起来像 out_file
    • @AdamWaite 我根据您的 snake_case 建议编辑了答案,将此评论留作上下文。
    • @zanbri - 如果我不关闭文件会怎样?
    • @BoratSagdiyev “不再引用的 File 对象符合垃圾收集条件。当 File 对象被垃圾收集时,该文件将自动关闭。” rootr.net/rubyfaq-9.html
    • @jkdev,是的,它将被关闭,但依赖它仍然被认为是代码异味,就像程序员从未关闭文件并让操作系统在解释器终止时关闭文件一样。如果打开多个文件并且代码从不关闭它们导致无法处理的情况和错误,那么两者都可能导致错误的错误。故意关闭它们或依赖自动关闭它们的块只是一种更好、更安全的做法。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      前段时间我自己也遇到过。

      【讨论】:

        【解决方案6】:

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

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

        Full description of file open modes on ruby-doc.org

        【讨论】:

          【解决方案7】:

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

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

          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 如果您必须在迭代循环中计算输出并希望在这样做时保持文件打开,则带有块的open 很有用。 write 非常有用,如果您要一次性输出内容然后关闭文件。

          更多信息请参见the documentation

          【讨论】:

          • 很好的回应,这是最惯用的,因此也是“Rubyist”的方式。应该是最佳答案。
          • 好吧,我同意。我很少使用块形式来写文件。视觉上太吵了。
          【解决方案8】:

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

           FileUtils.touch "foobar.txt"
          

          【讨论】:

            【解决方案9】:
            data = 'data you want inside the file'.
            

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-01-07
              • 1970-01-01
              • 2013-07-14
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多