是否可以这样做?
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>
答案 0 :(得分:43)
IO::write
。您的编辑显示您传递了错误的参数。第一个arg是文件名,第二个是要写的字符串,第三个是可选的偏移量,第四个是可以包含传递给open的选项的哈希。由于您要追加,您需要将偏移量作为文件的当前大小传递以使用此方法:
File.write('some-file.txt', 'here is some text', File.size('some-file.txt'), mode: 'a')
从讨论主题中提升:
此方法存在附加的并发问题,因为偏移的计算本质上是活泼的。这段代码首先会发现大小是X,打开文件,寻找X并写入。如果另一个进程或线程写入File.size
和File::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没有。他们现在可能,我不想安装最新版本。