2013-08-05 4 views
23

पर लिखने के लिए कैसे करें मैं एक टेम्पफाइल बनाने और इसमें कुछ पाठ लिखने की कोशिश कर रहा हूं। लेकिन मैं रेल कंसोल में इस अजीब व्यवहाररूबी 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    # => "" 

मैं भी cat /tmp/test_temp20130805-28300-1u5g9dv-0 की कोशिश की मिल लेकिन फाइल

मैं कुछ भी याद आ रही हूँ खाली है? या Tempfile पर लिखने का सही तरीका क्या है?

FYI करें मैं रूबी 1.8.7 का उपयोग कर रहा है और रेल 2.3.12

+0

यह पता लगाया गया कि 't.flush' सही समाधान है। – shiva

उत्तर

31

आप इसे करने के लिए लिख के बाद अस्थायी फ़ाइल को बंद करना चाहते हैं जा रहे हैं। अंत में t.close जोड़ें। मुझे लगता है कि फाइल ने आउटपुट buffered किया है।

+0

आप बिल्कुल सही हैं। 'T.close' कार्यों के बाद पढ़ना। – shiva

+1

यदि संभव हो तो फ़ाइल संचालन के लिए ब्लॉक का उपयोग करना पसंद करें, आपको इसे बंद करना याद रखना होगा, यह आपके लिए यह करेगा। कुछ विधियों का उपयोग करने से आप इसे स्वचालित रूप से बंद कर देंगे या आप भी। प्रलेखन के अनुसार, 'IO.read' ('File.read') इन तरीकों में से एक है। "पढ़ना सुनिश्चित करता है कि फ़ाइल लौटने से पहले बंद है।" – vgoff

+0

मैं रूबी के लिए बहुत नया हूं और मेरे यहां एक समान समस्या थी। मुझे इस मुद्दे को याद आया क्योंकि मुझे लगता है कि स्थानीय मशीन पर यह काम करता प्रतीत होता था, जबकि जब मैं एक बिल्ड सर्वर पर परीक्षण करता था तो मैं एक ही मुद्दा मार रहा था। कोई विचार क्यों यह अंतःस्थापित विफल हो जाएगा? मैं और भी चारों ओर खोज करने जा रहा हूं लेकिन पहले यहां पूछना चाहता था। – Elliott

16

बहुत जरूरी बुला .rewind है इस रन t.rewind प्रयास करें इससे पहले कि

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

हाँ यह भी बहुत अच्छा काम करता है। लेकिन जब आप फ़ाइल डिस्क्रिप्टर को बाद में पुन: उपयोग करना चाहते हैं, तो – shiva

+0

रिवाइंड को बंद करना और पढ़ना पसंद है, उदाहरण के लिए, 'ज़िप :: फ़ाइल.ओपेन (एफ) '। अन्यथा, यह बंद फ़ाइल के बारे में शिकायत करेगा। – glasz

+3

आपको अभी भी टेस्ट डेटा क्यों नहीं चाहिए songyy

6

यह उल्लेख के लायक है पढ़ा है, या बाद में किसी भी .read कॉल सिर्फ रिक्त मान वापस आ जाएगी

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