2013-08-05 23 views
23

Sto cercando di creare un file Tempfile e scrivere del testo in esso. Ma ottengo questo strano comportamento nella console rotaieRuby come scrivere su Tempfile

t = Tempfile.new("test_temp") # => #<File:/tmp/test_temp20130805-28300-1u5g9dv-0> 
t << "Test data"    # => #<File:/tmp/test_temp20130805-28300-1u5g9dv-0> 
t.write("test data")   # => 9 
IO.read t.path    # => "" 

Ho anche provato cat /tmp/test_temp20130805-28300-1u5g9dv-0 ma il file è vuoto

Mi sto perdendo qualcosa? O qual è il modo corretto di scrivere su Tempfile?

FYI che sto usando ruby ​​1.8.7 e 2.3.12 rotaie

+0

Calcolato "t.flush" è la soluzione perfetta. – shiva

risposta

31

Stai andando a voler chiudere il file temporaneo dopo aver scritto ad esso. Basta aggiungere un t.close alla fine. Scommetto che il file ha l'output bufferizzato.

+0

Hai assolutamente ragione. Leggere dopo che 't.close' funziona. – shiva

+1

Preferisci utilizzare i blocchi per le operazioni sui file, se possibile, non dovrai ricordarti di chiuderlo, lo farà per te. L'utilizzo di determinati metodi lo chiuderà automaticamente o anche tu. 'IO.read' (' File.read') è uno di questi metodi, secondo la documentazione. "read assicura che il file sia chiuso prima di tornare." – vgoff

+0

Sono abbastanza nuovo da Ruby e ho avuto un problema simile qui. Ho perso questo problema, perché penso che su una macchina locale sembrava funzionare mentre quando eseguivo il test su un server di build stavo colpendo lo stesso problema. Qualche idea sul perché questo potrebbe fallire a intermittenza? Cercherò anche di più, ma prima volevo chiedere qui. – Elliott

16

Prova questa corsa t.rewind prima di leggere

require 'tempfile' 
t = Tempfile.new("test_temp") 
t << "Test data" 
t.write("test data") # => 9 
IO.read t.path # => "" 
t.rewind 
IO.read t.path # => "Test datatest data" 
+0

sì anche questo funziona alla grande. Ma preferisco chiudere e leggere il riavvolgimento – shiva

+0

quando si desidera riutilizzare il descrittore di file in un secondo momento, ad esempio 'Zip :: File.open (f)'. altrimenti, si lamenterà del file chiuso. – glasz

+3

Perché hai ancora bisogno di 't <<" Dati di prova "'? – songyy

6

Vale la pena ricordare, chiamando .rewind è un must, o di qualsiasi successiva .read chiamata sarà solo tornare valore vuoto

2

close o rewind sarà effettivamente scrivere contenuti archiviare. E potresti volerlo cancellare dopo averlo usato:

file = Tempfile.new('test_temp') 
begin 
    file.write <<~FILE 
    Test data 
    test data 
    FILE 
    file.close 

    puts IO.read(file.path) #=> Test data\ntestdata\n 
ensure 
    file.delete 
end