Ruby Tempfile не создает файл на диске

В настоящее время я запускаю этот код на Ruby.

file = Tempfile.new(['tempemail', '.html'])
file << email # Email is a Ruby String (not nil)

Launchy.open(file.path)

Launchy жалуется, что файл не существует. Я запустил кошку и подтвердил это. Есть ли способ заставить Ruby сохранить Tempfile на диск?

РЕДАКТИРОВАТЬ:

Я сделал еще один тест. Я добавил file.rewind и file.read перед Launchy.open. Файл успешно содержит содержимое электронной почты.


person Astephen2    schedule 30.12.2014    source источник
comment
Можете ли вы распечатать file.path?   -  person Linuxios    schedule 31.12.2014
comment
Конечно вещь. Это /var/folders/1r/84k38sw54fbcgrh9hlgvt8b80000gn/T/tempemail20141230-10511-2gj1yp.html или его разновидность. Я должен дать некоторую информацию о моей настройке. Ruby 2.1.2 под RVM на Mavericks.   -  person Astephen2    schedule 31.12.2014
comment
Что произойдет, если вы добавите file.flush перед открытием Launchy?   -  person Linuxios    schedule 31.12.2014
comment
Launchy все еще жалуется, и файл все еще не существует на диске (согласно коту)   -  person Astephen2    schedule 31.12.2014
comment
Если добавить file.close?   -  person Linuxios    schedule 31.12.2014
comment
Я пытался сделать file.close перед Launchy.open и после него (до file.unlink). Ни один из них не работал.   -  person Astephen2    schedule 31.12.2014
comment
Это странно. Почему бы вам просто не попробовать использовать Tempfile?   -  person Linuxios    schedule 31.12.2014
comment
Мне нравятся свойства временного файла. По сути, я хочу создать файл, открыть его в браузере Launchy, а затем удалить файл.   -  person Astephen2    schedule 31.12.2014


Ответы (1)


Можешь попробовать file.close.

Тест без запуска:

require 'tempfile'
file = Tempfile.new(['tempemail', '.html'])
file << 'xx' # Email is a Ruby String (not nil)

file.close #<- This is needed

p File.read(file.path) # -> 'xx'

Без file.close вы получите пустую строку.

Вместо close вы также можете использовать flush, если вы продолжаете записывать данные в файл:

require 'tempfile'
file = Tempfile.new(['tempemail', '.html'])
file << "xx\n" # Email is a Ruby String (not nil)

p file.path
file.flush

file << "yy\n" # Email is a Ruby String (not nil)
file.flush

p File.read(file.path)
person knut    schedule 30.12.2014
comment
Он просто сказал в комментариях, что это не работает, и технически file.close должен удалить файл. - person Linuxios; 31.12.2014
comment
Я также пытался сделать cat #{file.path} в сценарии. Работал нормально. Похоже, проблема с Launchy. Большое спасибо Linuxios и knut! - person Astephen2; 31.12.2014
comment
@ Astephen2, у меня сейчас такая же проблема. Я даже не могу заставить sh.cat #{tempfile.path} работать. Я также не могу использовать system("open #{tempfile.path}"). Похоже, что Tempfile позволяет пользователю манипулировать им только как объектом File, а не как внешним файлом в скрипте Ruby. Так что это не вина Launchy. - person AlvaPan; 09.12.2015