Ruby cum să scrie în Tempfile (Programare, Ruby Pe Șine, Ruby, Fișier Io)

Siva a intrebat.

Încerc să creez un Tempfile și să scriu un text în el. Dar primesc acest comportament ciudat în consola rails

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

De asemenea, am încercat cat /tmp/test_temp20130805-28300-1u5g9dv-0 dar fișierul este gol

Îmi scapă ceva? Sau care este modalitatea corectă de a scrie în Tempfile?

FYI Folosesc ruby 1.8.7 și rails 2.3.12.

Comentarii

  • Am găsit o soluție t.flush este soluția perfectă. –  > Por Siva.
4 răspunsuri
squiguy

Vei dori să închizi fișierul temporar după ce ai scris în el. Pur și simplu adăugați un t.close la sfârșit. Pun pariu că fișierul are ieșire tamponată.

Comentarii

  • Preferați să folosiți blocuri pentru operațiunile cu fișiere dacă este posibil, nu va trebui să vă amintiți să îl închideți, o va face pentru dvs. De asemenea, utilizarea anumitor metode îl va închide automat și pentru dumneavoastră. IO.read (File.read) este una dintre aceste metode, conform documentației. „Read se asigură că fișierul este închis înainte de a se întoarce.” –  > Por vgoff.
  • Sunt destul de nou în ruby și am avut o problemă similară aici. Mi-a scăpat această problemă cred că pentru că pe o mașină locală părea să funcționeze, în timp ce atunci când am testat pe un server de compilare m-am lovit de aceeași problemă. Aveți vreo idee de ce ar putea eșua intermitent? Am de gând să caut mai mult, dar am vrut să întreb mai întâi aici. –  > Por Elliott.
Debadatt

Încercați această execuție t.rewind înainte de a citi

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"

Comentarii

  • rewind are sens atunci când doriți să reutilizați descriptorul de fișier mai târziu, de ex, Zip::File.open(f). altfel, se va plânge de fișierul închis. –  > Por glasz.
  • De ce mai aveți nevoie de t << "Test data"? –  > Por songyy.
Lev Lukomsky

close sau rewind va scrie efectiv conținutul în fișier. Și este posibil să doriți să îl ștergeți după utilizare:

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

  puts IO.read(file.path) #=> Test data
testdata

ensure
  file.delete
end

Artur Beljajev

Este demn de menționat că, apelarea .rewind este o necesitate, sau orice apelare ulterioară .read apel va returna doar o valoare goală