2013-08-05 12 views
23

Ich versuche, eine Tempdatei zu erstellen und etwas Text hinein zu schreiben. Aber ich habe dieses seltsame Verhalten in Schienen KonsoleRuby, wie man in Tempfile schreibt

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    # => "" 

Ich habe auch versucht cat /tmp/test_temp20130805-28300-1u5g9dv-0 aber die Datei ist leer

Bin ich etwas fehlt? Oder was ist der richtige Weg, um Tempfile zu schreiben?

FYI bin ich mit Rubin 1.8.7 und Schienen 2.3.12

+0

es herausgefunden 't.flush' ist die perfekte Lösung. – shiva

Antwort

31

Sie werden die temporäre Datei nach dem Schreiben, um es schließen wollen. Fügen Sie einfach ein t.close zum Ende hinzu. Ich wette, die Datei hat gepufferte Ausgabe.

+0

Sie haben absolut Recht. Das Lesen nach 't.close' funktioniert. – shiva

+1

Bevorzugen Sie, Blöcke für Dateioperationen zu verwenden, wenn möglich, müssen Sie nicht daran denken, es zu schließen, es wird es für Sie tun. Wenn Sie bestimmte Methoden verwenden, werden sie auch automatisch geschlossen. 'IO.read' (' File.read') ist laut Dokumentation eine dieser Methoden. "read stellt sicher, dass die Datei vor dem Zurückkehren geschlossen wird." – vgoff

+0

Ich bin ziemlich neu in Ruby und ich hatte ein ähnliches Problem hier. Ich habe dieses Problem vermisst, weil es auf einem lokalen Rechner funktioniert zu haben, während ich auf einem Build-Server getestet habe, dass ich das gleiche Problem habe. Irgendeine Idee, warum dies mit Unterbrechungen fehlschlagen würde? Ich werde auch mehr suchen, wollte aber zuerst hier fragen. – Elliott

16

Versuchen Sie, diese laufen t.rewind vor

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

ja das funktioniert auch super. Aber ich ziehe es vor zu schließen und zu lesen – shiva

+0

Rücklauf macht Sinn, wenn Sie den Dateideskriptor später wiederverwenden möchten, z. B. 'Zip :: File.open (f)'. sonst wird es über geschlossene Datei beschweren. – glasz

+3

Warum brauchen Sie noch 't <<" Test data "'? – songyy

6

lesen wert Es ist zu erwähnen, nennen .rewind ist ein Muss, oder jede nachfolgende .read Anruf wird nur leere Wert zurück

2

close oder rewind tatsächlich Inhalt schreiben einordnen. Und möglicherweise möchten Sie es löschen, nachdem Sie:

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