New और Create में क्या अंतर है?
आप देखेंगे कि Tempfile में फाइलें बनाने के लिए दो मेथड्स हैं।
एक है new, और दूसरा है create।
अंतर क्या है?
डॉक्यूमेंटेशन के अनुसार, new एक Tempfile ऑब्जेक्ट बनाता है (जैसा कि आप उम्मीद करेंगे), लेकिन create आपको एक File ऑब्जेक्ट देता है।
मुझे नहीं लगता कि यह वास्तव में मायने रखता है, क्योंकि Tempfile File को डेलिगेट करता है।
असली अंतर यह है कि create एक ब्लॉक स्वीकार करता है।
लेकिन new नहीं करता।
इसे आज़माएं:
Tempfile.new {}
आपको यह उपयोगी चेतावनी मिलेगी:
# warning: Tempfile.new doesn't call the given block.
आप create के साथ एक ब्लॉक का उपयोग यह सुनिश्चित करने के लिए कर सकते हैं कि ब्लॉक समाप्त होने के बाद आपकी टेम्पररी फाइल डिलीट हो जाए।
यह निम्नलिखित प्रश्न उठाता है...
TempFile कब डिलीट होती है?
आप नियंत्रित कर सकते हैं कि फाइल कब डिलीट होती है, इसे स्वयं एक नियमित फाइल की तरह डिलीट करके (delete मेथड), या create के साथ एक ब्लॉक का उपयोग करके।
ऑटोमैटिक डिलीटिंग तब काम करती है जब:
- आपका प्रोग्राम समाप्त होता है
- आपकी फाइल "गार्बेज कलेक्ट" हो जाती है, दूसरे शब्दों में, फाइल को स्पेस खाली करने के लिए एक एल्गोरिदम द्वारा मेमोरी से हटा दिया जाता है
बाद वाला केवल तभी हो सकता है जब आप फाइल का कोई रेफरेंस नहीं रख रहे हों।
जैसे एक वेरिएबल।
मेरा मतलब यहाँ है:
t = Tempfile.new
जब t स्कोप से बाहर जाता है, तो टेम्पररी फाइल हटाई जा सकती है।
यदि आप लिनक्स का उपयोग कर रहे हैं, तो रियल टाइम में कौन सी फाइलें बनाई और डिलीट की जा रही हैं, इसे देखने के लिए एक बहुत दिलचस्प टूल inotify-tools है।
यह कमांड आज़माएं:
inotifywait /tmp -m --format "%w %e %f %T" --timefmt "%H:%m:%S"
फिर कुछ Ruby कोड चलाएं जो फाइलें बनाता है।
उदाहरण:
ruby -rtempfile -e "def c; t = Tempfile.new('testing'); end; c; sleep 10"
आप यह देखेंगे:
/tmp/ CREATE testing20190506-11391-1wqcng0 14:51:48 /tmp/ OPEN testing20190506-11391-1wqcng0 14:51:48 /tmp/ CLOSE_WRITE,CLOSE testing20190506-11391-1wqcng0 14:51:58 /tmp/ DELETE testing20190506-11391-1wqcng0 14:51:58
आप अपने टेम्प फाइल से वापस क्यों नहीं पढ़ सकते?
यदि आप अपनी टेम्पररी फाइलों में से एक से वापस पढ़ने का प्रयास करते हैं तो आपको एक खाली स्ट्रिंग मिलेगी।
उदाहरण:
Tempfile.create { |f| f << "abc\n"; f.read } # ""
ऐसा क्यों है?
यह पता चला है कि Files IO ऑब्जेक्ट्स हैं।
IO ऑब्जेक्ट्स में एक पोजीशन पॉइंटर होता है और जब आप एक फाइल में लिखते हैं तो यह पोजीशन आगे बढ़ती है।
इसलिए यदि आप पढ़ना चाहते हैं, तो आपको इस पॉइंटर को रिवाइंड करना होगा।
इस तरह:
Tempfile.create { |f| f << "abc\n"; f.rewind; f.read } # "abc\n"
आपको अपनी फाइल कंटेंट को फ्लश करने की भी आवश्यकता हो सकती है।
उदाहरण:
temp = Tempfile.new temp << "1" temp << "2" temp.flush
क्या टेम्पफाइल्स वास्तव में यूनिक हैं?
Tempfile एक यूनिक फाइलनाम बनाता है और परमिशन मोड को 600 पर सेट करता है, जिसका अर्थ है कि केवल इस फाइल को बनाने वाला यूज़र इसे पढ़ सकता है।
लेकिन क्या कभी डुप्लिकेट नाम हो सकता है?
डॉक्यूमेंटेशन यह कहता है:
"Tempfile की फाइलनाम चुनने की विधि थ्रेड-सेफ और इंटर-प्रोसेस-सेफ दोनों है: यह गारंटी देता है कि कोई अन्य थ्रेड या प्रोसेस वही फाइलनाम नहीं चुनेगा।"
और new का विवरण भी कहता है कि यदि यह एक यूनिक फाइलनाम नहीं ढूंढ पाता तो यह एरर उठा सकता है।
यह जानना भी अच्छा है कि आप अपनी फाइलों के लिए एक प्रीफिक्स सेट कर सकते हैं।
इस तरह:
Tempfile.new("banana-").path # "/tmp/banana-20190426-25403-1cm7sjt"
यह नाम टकराव की संभावना को कम करता है।
बाइनरी मोड में टेम्पफाइल खोलना
यदि आप इमेजेज, संगीत, या प्लेन टेक्स्ट के अलावा किसी भी चीज़ के साथ काम कर रहे हैं तो आप अपने फाइल मोड को बाइनरी पर सेट करना चाह सकते हैं।
बाइनरी फाइल मोड लाइन-एंडिंग कन्वर्जन को रोकेगा।
परिणामस्वरूप, डेटा अधिक "रॉ" होगा और आप बाइनरी फाइल के हिस्सों को तोड़ने से बचेंगे।
बाइनरी मोड डिफ़ॉल्ट रूप से सक्षम नहीं है:
temp = Tempfile.new temp.binmode? # false
आप इसे इस तरह सक्षम कर सकते हैं:
temp = Tempfile.new temp.binmode temp.binmode? # true
यह create मेथड के साथ भी काम करता है:
Tempfile.create do |f| f.binmode f << "bacon\n" end
सारांश
आपने Ruby में Tempfile क्लास का उपयोग करके टेम्पररी फाइल्स के बारे में सीखा!
अब अभ्यास करने की आपकी बारी है।
पढ़ने के लिए धन्यवाद 🙂