2016-04-27 2 views
1

Я пытаюсь открыть tmpfile в системе $ EDITOR, записать в него, а затем прочитать на выходе. Я могу заставить его работать, но мне интересно, почему вызов file.read возвращает пустую строку (когда файл имеет контент)Ruby: Чтение из файла, написанного системным процессом

В принципе, я хотел бы знать правильный способ чтения файла, как только он был написано на.

require 'tempfile' 

file = Tempfile.new("note") 

system("$EDITOR #{file.path}") 

file.rewind 
puts file.read # this puts out an empty string "" .. why? 

puts IO.read(file.path) # this puts out the contents of the file 

Да, я буду работать в этом блоке, чтобы обеспечить Nuke файл один раз используется;)

я бегу это на рубин 2.2.2 и с помощью Vim.

+0

Какую версию рубина вы используете, и какой редактор вы использовали для редактирования содержимого. –

+0

Я прокомментировал - какая разница, по вашему мнению, это делает? –

+0

Было бы полезно, если бы вы использовали что-то другое, кроме vim, потому что вызов 'system' завершился бы до того, как сам редактор будет. Мое первое предположение заключалось в том, что вы пытались прочитать файл до того, как редактор написал все байт. Я думаю, что нашел свое исправление, хотя, пожалуйста, см. Мой ответ ниже. –

ответ

1

Убедитесь, что вы звоните open на объект файла, прежде чем пытаться прочитать его в:

require 'tempfile' 

file = Tempfile.new("note") 

system("$EDITOR #{file.path}") 

file.open 
puts file.read 
file.close 
file.unlink 

Это также позволит вам избежать вызова rewind на файл, так как ваш процесс не написал ни байтов он в то время, когда вы его открываете.

Я считаю, что IO.read всегда откроет файл для вас, поэтому он и работал в этом случае. В то время как вызов .read на объект типа IO не всегда открывает файл для вас.

+0

Doh! да, должен был называть его открытым. Благодаря! - и у меня будет игра с другими системными редакторами, которые OSX предлагает мне (поскольку я хочу, чтобы она работала, по крайней мере, с основными). Спасибо, Стивен! –

Смежные вопросы