একটি অস্থায়ী ফাইল তৈরি করা আপনাকে আপনার O.S এর ভিতরে একটি র্যান্ডম নামের একটি খালি ফাইল দেয়। (অপারেটিং সিস্টেম) অস্থায়ী ফোল্ডার।
এই ফাইলটি স্বয়ংক্রিয়ভাবে মুছে ফেলা হয় .
আপনি কিভাবে রুবিতে এটি করতে পারেন?
এরকম :
require 'tempfile'
Tempfile.create { |f| f << "abc\n" }
যেখানে f আপনার ফাইল এবং << এটিতে লেখেন৷
এটি রুবিতে তৈরি করা হয়েছে তাই আপনাকে কোনো রত্ন ইনস্টল করতে হবে না।
ঠিক আছে।
এটি যথেষ্ট সহজ, কিন্তু আপনার এখনও প্রশ্ন থাকতে পারে।
লাইক :
- ফাইলটি ঠিক কখন মুছে ফেলা হয়?
- কেন আমি আমার টেম্প ফাইল থেকে আবার পড়তে পারি না?
- টেম্পফাইলগুলি কি অনন্য হওয়ার নিশ্চয়তা আছে?
আমি এই প্রশ্নগুলির উত্তর দিতে যাচ্ছি এবং আরও কয়েকটির যাতে আপনি আরও গভীর বোঝার বিকাশ করতে পারেন!
নতুন এবং তৈরির মধ্যে পার্থক্য কী?
আপনি লক্ষ্য করবেন যে Tempfile ফাইল তৈরির জন্য দুটি পদ্ধতি আছে।
একটি হল new , এবং অন্যটি হল create .
পার্থক্য কি?
ডকুমেন্টেশন অনুযায়ী, new একটি Tempfile তৈরি করে বস্তু (যেমন আপনি আশা করবেন), কিন্তু create আপনাকে একটি File দেয় বস্তু।
আমি মনে করি না যে এটি সত্যিই গুরুত্বপূর্ণ, কারণ Tempfile File-এ প্রতিনিধি .
আসল পার্থক্য হল create একটি ব্লক গ্রহণ করে৷
কিন্তু new করে না।
এটি চেষ্টা করুন :
Tempfile.new {}
আপনি এই সহায়ক সতর্কতা পাবেন :
# warning: Tempfile.new doesn't call the given block.
আপনি create দিয়ে একটি ব্লক ব্যবহার করতে পারেন ব্লক শেষ হওয়ার পরে আপনার অস্থায়ী ফাইল মুছে ফেলা হয় তা নিশ্চিত করতে।
এটি নিম্নলিখিত প্রশ্ন নিয়ে আসে...
একটি টেম্পফাইল কখন মুছে ফেলা হয়?
ফাইলটি কখন মুছে ফেলা হবে তা আপনি নিয়মিত ফাইলের মতো মুছে দিয়ে নিয়ন্ত্রণ করতে পারেন (delete পদ্ধতি), অথবা create ব্যবহার করে একটি ব্লক সহ।
স্বয়ংক্রিয়ভাবে মুছে ফেলা কাজ করে যখন :
- আপনার প্রোগ্রাম শেষ হয়
- আপনার ফাইল "আবর্জনা সংগ্রহ" পায়, অন্য কথায়, স্থান খালি করার জন্য ফাইলটি একটি অ্যালগরিদম দ্বারা মেমরি থেকে সরানো হয়
পরবর্তীটি শুধুমাত্র তখনই ঘটতে পারে যদি আপনি ফাইলটির কোনো রেফারেন্স না রাখেন।
একটি ভেরিয়েবলের মত।
আমি এটাই বলতে চাইছি :
t = Tempfile.new
যখন t সুযোগের বাইরে চলে যায়, তাহলে অস্থায়ী ফাইলটি সরানো যেতে পারে।
আপনি যদি লিনাক্স ব্যবহার করেন, তাহলে রিয়েল টাইমে কোন ফাইল তৈরি এবং মুছে ফেলা হচ্ছে তা দেখার জন্য একটি খুব আকর্ষণীয় টুল হল 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
কেন আপনি আপনার টেম্প ফাইল থেকে ফিরে পড়তে পারবেন না?
আপনি যদি আপনার অস্থায়ী ফাইলগুলির একটি থেকে পড়ার চেষ্টা করেন তবে আপনি একটি খালি স্ট্রিং পাবেন৷
উদাহরণ :
Tempfile.create { |f| f << "abc\n"; f.read }
# ""
এটা কেন?
দেখা যাচ্ছে যে File হল 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 এ সেট করে, যার মানে হল যে এই ফাইলটি তৈরি করেছে শুধুমাত্র সেই ব্যবহারকারীই এটি পড়তে পারবে।
কিন্তু কখনও একটি সদৃশ নাম হতে পারে?
ডকুমেন্টেশন এটি বলে :
"টেম্পফাইলের ফাইলের নাম বাছাই পদ্ধতিটি থ্রেড-নিরাপদ এবং আন্ত-প্রক্রিয়া-নিরাপদ উভয়ই:এটি গ্যারান্টি দেয় যে অন্য কোনও থ্রেড বা প্রক্রিয়া একই ফাইলের নাম বাছাই করবে না।"
এবং 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 ব্যবহার করে রুবিতে অস্থায়ী ফাইল সম্পর্কে শিখেছেন ক্লাস!
এখন আপনার অনুশীলনের পালা।
পড়ার জন্য ধন্যবাদ 🙂