你可以在Ruby中一行创建/写/附加一个字符串

时间:2013-04-07 17:00:45

标签: ruby

是否可以这样做?

v='some text'
w='my' + Time.new.strftime("%m-%d-%Y").to_s + '.txt'
File.write(w,v) # will create file if it doesn't exist and recreates everytime 

无需在实例上执行File.open?即只是一个将附加或创建和写入的类方法?理想情况下,红宝石1.9.3溶液。

THX

修改1

这是我根据文档尝试的内容。我没见过rdoc,但看过其他一些例子。我再次询问是否可以通过File.write以附加模式打开文件? THX

irb(main):014:0> File.write('some-file.txt','here is some text',"a")
TypeError: can't convert String into Integer
    from (irb):14:in `write'
    from (irb):14
    from /usr/local/rvm/rubies/ruby-1.9.3-p392/bin/irb:13:in `<main>'
irb(main):015:0>


irb(main):015:0> File.write('some-file.txt','here is some text',O_APPEND)
NameError: uninitialized constant O_APPEND
    from (irb):15
    from /usr/local/rvm/rubies/ruby-1.9.3-p392/bin/irb:13:in `<main>'
irb(main):016:0>

4 个答案:

答案 0 :(得分:43)

自1.9.3以来,Ruby已经拥有IO::write。您的编辑显示您传递了错误的参数。第一个arg是文件名,第二个是要写的字符串,第三个是可选的偏移量,第四个是可以包含传递给open的选项的哈希。由于您要追加,您需要将偏移量作为文件的当前大小传递以使用此方法:

File.write('some-file.txt', 'here is some text', File.size('some-file.txt'), mode: 'a')

从讨论主题中提升: 此方法存在附加的并发问题,因为偏移的计算本质上是活泼的。这段代码首先会发现大小是X,打开文件,寻找X并写入。如果另一个进程或线程写入File.sizeFile::write内的搜索/写入之间的末尾,我们将不再附加并将覆盖数据。

如果使用'a'模式打开文件并且没有搜索,则保证从为fopen(3) with O_APPEND定义的POSIX语义写到最后;所以我推荐这个:

File.open('some-file.txt', 'a') { |f| f.write('here is some text') }

答案 1 :(得分:10)

要说清楚,因为有些评论建议我测试这个有效: IO.write("/tmp/testfile", "gagaga\n", mode: 'a')

那个附加到文件而不需要计算偏移量。 Rubydoc有点误导。这是一个关于此的错误: https://bugs.ruby-lang.org/issues/11638

答案 2 :(得分:4)

File.open('my' + Time.new.strftime("%m-%d-%Y").to_s + '.txt', 'w') { |file| file.write("some text") }

答案 3 :(得分:3)

MRI已经有了这种方法(我确实复制并粘贴了你的代码并且它有效),但是上次我检查时,JRuby和Rubinius没有。他们现在可能,我不想安装最新版本。

http://rdoc.info/stdlib/core/IO.write