2014-12-30 3 views
1

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

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

Launchy.open(file.path) 

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

EDIT:

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

+0

Вы можете напечатать file.path? – Linuxios

+0

Несомненно. Это «/var/folders/1r/84k38sw54fbcgrh9hlgvt8b80000gn/T/tempemail20141230-10511-2gj1yp.html» или некоторые варианты. Я должен дать некоторую информацию о моей настройке. Ruby 2.1.2 под RVM на Mavericks. – Astephen2

+0

Что произойдет, если вы добавите 'file.flush' перед открытием Launchy? – Linuxios

ответ

0

Вы можете попробовать file.close.

Тест без Launchy:

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) 
+0

Он только что сказал в комментариях, что это не сработает, и технически файл 'file.close' должен удалить файл. – Linuxios

+0

Этот конкретный набор действий работал просто отлично. – Astephen2

+0

Я также попытался сделать 'cat # {file.path}' в скрипте. Отлично. Кажется, это проблема с Launchy. Большое спасибо Linuxios и knut! – Astephen2

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