एक अस्थायी फ़ाइल बनाने से आपको अपने O.S के अंदर एक यादृच्छिक नाम वाली एक खाली फ़ाइल मिलती है। (ऑपरेटिंग सिस्टम) अस्थायी फ़ोल्डर।
यह फ़ाइल स्वचालित रूप से हटा दी जाती है ।
आप इसे रूबी में कैसे कर सकते हैं?
इसे पसंद करें :
require 'tempfile' Tempfile.create { |f| f << "abc\n" }
जहां f
क्या आपकी फ़ाइल और <<
. है उसे लिखता है।
यह रूबी में बनाया गया है, इसलिए आपको कोई रत्न स्थापित करने की आवश्यकता नहीं है।
ठीक है।
यह काफी आसान है, लेकिन आपके पास अभी भी प्रश्न हो सकते हैं।
पसंद करें :
- फ़ाइल वास्तव में कब हटाई जाती है?
- मैं अपनी अस्थायी फ़ाइल से वापस क्यों नहीं पढ़ सकता?
- क्या tempfiles के अद्वितीय होने की गारंटी है?
मैं इन सवालों और कुछ और सवालों के जवाब देने जा रहा हूं ताकि आप एक गहरी समझ विकसित कर सकें!
नए और बनाएं में क्या अंतर है?
आप देखेंगे कि 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
दायरे से बाहर हो जाता है, तो अस्थायी फ़ाइल को हटाया जा सकता है।
यदि आप Linux का उपयोग कर रहे हैं, तो यह देखने के लिए कि कौन-सी फ़ाइलें वास्तविक समय में बनाई और हटाई जा रही हैं, एक बहुत ही दिलचस्प टूल inotify-tools है।
इस आदेश को आजमाएं :
inotifywait /tmp -m --format "%w %e %f %T" --timefmt "%H:%m:%S"
फिर कुछ रूबी कोड चलाएँ जो फ़ाइलें बनाता है।
उदाहरण :
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
आप अपनी Temp फ़ाइल से वापस क्यों नहीं पढ़ सकते?
यदि आप अपनी किसी अस्थायी फ़ाइल से वापस पढ़ने का प्रयास करते हैं तो आपको एक खाली स्ट्रिंग मिलेगी।
उदाहरण :
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
क्या Tempfiles वाकई अद्वितीय हैं?
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
सारांश
आपने Tempfile
. का उपयोग करके रूबी में अस्थायी फ़ाइलों के बारे में सीखा है कक्षा!
अब अभ्यास करने की आपकी बारी है।
पढ़ने के लिए धन्यवाद