কম্পিউটার টিউটোরিয়াল

রুবিতে টেম্পোরারি ফাইল মাস্টার করুন: একটি প্র্যাক্টিক্যাল গাইড

একটি টেম্পোরারি ফাইল তৈরি করলে আপনাকে আপনার O.S. (অপারেটিং সিস্টেম) টেম্পোরারি ফোল্ডারের ভিতরে একটি র‍্যান্ডম নামসহ খালি ফাইল मिलে।

এই ফাইলটি স্বয়ংক্রিয়ভাবে ডিলিট হয়।

রুবিতে এটা কীভাবে করবেন?

এভাবে:

require 'tempfile'
Tempfile.create { |f| f << "abc\n" }

যেখানে f আপনার ফাইল এবং << এটিতে লিখে।

এটি রুবিতে বিল্ট-ইন থাকায় আপনাকে কোনো জেম ইনস্টল করতে হয় না।

ঠিক আছে।

এটা যথেষ্ট সিম্পল, কিন্তু আপনার মনে এখনও কিছু প্রশ্ন থাকতে পারে।

যেমন:

  • ফাইলটি কখন ডিলিট হয় ঠিক করে?
  • আমি আমার টেম্প ফাইল থেকে পড়তে কেন পারছি না?
  • টেম্পফাইলগুলো কি গ্যারান্টিড ইউনিক?

আমি এই প্রশ্নগুলোর উত্তর দেব এবং আরও কিছু যাতে আপনি গভীর বোঝাপড়া অর্জন করতে পারেন!

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 -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"

এটি নাম কলিশনের সম্ভাবনা কমিয়ে দেয়।

বাইনারি মোডে একটি টেম্পফাইল ওপেন করা

আপনি যদি ইমেজ, মিউজিক, বা প্লেইন টেক্সট ছাড়া অন্য কিছুর সাথে কাজ করেন তবে আপনি আপনার ফাইল মোডকে বাইনারি সেট করতে চাইতে পারেন।

বাইনারি ফাইল মোড লাইন-এন্ডিং কনভার্সন বন্ধ করে দেয়।

ফলস্বরূপ, ডেটা আরও "raw" থাকবে এবং আপনি বাইনারি ফাইলের অংশগুলো ব্রেক হওয়া থেকে বাঁচতে পারবেন।

বাইনারি মোড ডিফল্টভাবে এনাবলড নয়:

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 ক্লাস ব্যবহার করে টেম্পোরারি ফাইল সম্পর্কে শিখেছেন!

এখন আপনার পালা প্র্যাক্টিস করার।

পড়ার জন্য ধন্যবাদ 🙂

  1. রুবিতে ফাইল পড়া এবং লেখা: একটি স্টেপ-বাই-স্টেপ গাইড

  2. ম্যাকওএসে টেক্সট ফাইল তৈরি করার ধাপে ধাপে গাইড

  3. উইন্ডোজ ১০-এ টেম্পোরারি ফাইল ডিলিট করার দক্ষ গাইড দ্রুত পারফরম্যান্সের জন্য

  4. উইন্ডোজ ১১-এ PDF তৈরি করার ধাপে ধাপে গাইড