2013-08-05 1 views
23

Tempfile을 만들고 그것에 텍스트를 쓰려고합니다. 그러나 나는 또한 cat /tmp/test_temp20130805-28300-1u5g9dv-0을 시도루비 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    # => "" 

레일 콘솔에서이 이상한 행동을 얻을 수 있지만, 파일

난 아무것도 실종 비어? 또는 Tempfile에 쓸 수있는 적절한 방법은 무엇입니까?

는 참고로 나는 당신이 그것에 작성 후 임시 파일을 닫으려는거야 루비 1.8.7를 사용하고 2.3.12

+0

't.flush'는 완벽한 해결책입니다. – shiva

답변

31

레일 있어요. 끝 부분에 t.close을 추가하기 만하면됩니다. 파일에 버퍼링 된 출력이있을 것입니다. 그것은 언급 할 가치가

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

당신은 절대적으로 옳습니다. 't.close' 이후의 읽기가 작동합니다. – shiva

+1

가능한 경우 파일 작업을위한 블록을 사용하는 것이 좋습니다. 닫을 필요가 없으므로 대신 작업을 수행 할 것입니다. 특정 방법을 사용하면 자동으로 닫힙니다. 'IO.read' ('File.read')는 문서에 따라 이러한 방법 중 하나입니다. "read는 파일이 반환되기 전에 닫혀 있는지 확인합니다." – vgoff

+0

나는 루비를 처음 접했고 비슷한 문제가있다. 나는이 문제를 놓쳤다. 왜냐하면 로컬 머신에서는 서버를 빌드 할 때 동일한 문제를 겪고있는 반면 테스트는 작동하는 것처럼 보였기 때문이다. 이것이 일시적으로 실패하는 이유는 무엇입니까? 나는 더 많이 주변에서 검색 할 것이고, 그러나 여기에서 첫번째로 묻고 싶다. – Elliott

16

은 필수을 .rewind입니다 호출이 실행 t.rewind을 시도하거나 이후 .read 전화는 빈 값을

+0

예, 이것도 훌륭하게 작동합니다. 하지만 파일 설명자를 나중에 다시 사용하고자 할 때, 예를 들어,'Zip :: File.open (f)'와 같이 닫고 읽는 것을 선호합니다. – shiva

+0

되감기는 의미가 있습니다. 그렇지 않으면 닫힌 파일에 대해 불평 할 것입니다. – glasz

+3

왜 여전히't << "테스트 데이터"가 필요합니까? – songyy

6

를 읽기 전에

2

close 또는 rewind 실제로 내용을 기록합니다 돌아갑니다 파일로. 그리고 사용 후 삭제할 수도 있습니다 :

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