Вы можете создать/написать/добавить строку в файл в одной строке в 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 солнц.
ТНХ
Изменить 1
вот что я пробовал на основе документов. Я не видел rdoc, но видел другие примеры. Опять же, я просто спрашиваю, можно ли открыть файл в режиме добавления через File.write? ТНХ
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>
Ответы
Ответ 1
Ruby имел IO::write
начиная с версии 1.9.3. Ваше редактирование показывает, что вы передаете неправильные аргументы. Первый arg - это имя файла, второе - строка для записи, третья - необязательное смещение, а четвертое - хэш, который может содержать опции для перехода к открытому. Поскольку вы хотите добавить, вам нужно передать смещение в качестве текущего размера файла для использования этого метода:
File.write('some-file.txt', 'here is some text', File.size('some-file.txt'), mode: 'a')
Подъем из обсуждения:
Этот метод имеет concurrency проблемы для append, потому что вычисление смещения по своей сути является racy. Этот код сначала найдет размер X, откройте файл, найдите X и напишите. Если другой процесс или поток записывается в конец между File.size
и seek/write внутри File::write
, мы больше не будем добавлять и будем переписывать данные.
Если один открывает файл, используя режим 'a' и не ищет, то гарантированно будет записываться в конец из семантики POSIX, определенной для fopen ( 3) с O_APPEND
; поэтому я рекомендую это вместо:
File.open('some-file.txt', 'a') { |f| f.write('here is some text') }
Ответ 2
Чтобы было ясно, что некоторые комментарии показывают, что я тестировал эту работу:
IO.write("/tmp/testfile", "gagaga\n", mode: 'a')
Этот файл присоединяется к файлу без необходимости вычисления смещения. Rubydoc мало вводит в заблуждение. Вот ошибка об этом:
https://bugs.ruby-lang.org/issues/11638
Ответ 3
File.open('my' + Time.new.strftime("%m-%d-%Y").to_s + '.txt', 'w') { |file| file.write("some text") }
Ответ 4
У МРТ уже есть этот метод (я буквально скопировал и вставил ваш код, и он работал), но в прошлый раз, когда я проверил, JRuby и Rubinius этого не сделали. Они могут теперь, мне не хочется устанавливать последние версии, чтобы увидеть.
http://rdoc.info/stdlib/core/IO.write