আপনি কি জানতেন যে আপনি রুবি দিয়ে আপনার ফাইল সিস্টেম নেভিগেট করতে পারেন?
রুবি “Dir” ক্লাসের সাথে।
আপনি ডিরেক্টরি এন্ট্রি লিস্ট করতে পারেন, আপনার বর্তমান ডিরেক্টরি পরিবর্তন করতে পারেন এবং এমনকি নতুন ফোল্ডার তৈরি করতে পারেন!
এখানে একটি উদাহরণ:
filenames = Dir.entries(".") এই entries মেথড ফাইলনেম এন্ট্রির একটি অ্যারে রিটার্ন করে। প্রতিটি এন্ট্রি একটি স্ট্রিং, তাই আপনি যদি আসলে এই ফাইলগুলো পড়তে চান তবে আপনাকে এটি রুবি File ক্লাসের সাথে কম্বাইন করতে হবে।
বিটিডব্লিউ, এই ডট (.) বর্তমান ডিরেক্টরি-কে প্রতীক করে।
এটি হবে সেই ডিরেক্টরি যেখানে থেকে আপনার কোড চলছে, আপনার টার্মিনালে আপনি যেখান থাকেন (কোড রান করার সময়) সেটা নয়।
সেজন্য…
আপনার বর্তমান ডিরেক্টরি চেক করার জন্য Dir.pwd মেথড ব্যবহার করা সহায়ক হতে পারে।
এখন:
চলুন শিখি Dir ক্লাস কীভাবে ব্যবহার করে নতুন ডিরেক্টরি তৈরি করা (mkdir), রিনেম করা (mv), এবং একটি নির্দিষ্ট প্যাটার্ন অনুসরণকারী ফাইল নাম খুঁজে বের করা (glob)।
রুবির Mkdir মেথড ব্যবহার করে একটি নতুন ডিরেক্টরি তৈরি করা
আপনি যদি রুবি দিয়ে একটি নতুন ফোল্ডার তৈরি করতে চান তবে আপনি Dir.mkdir মেথড ব্যবহার করতে পারেন।
উদাহরণ:
Dir.mkdir("testing") যদি একটি রিলেটিভ পাথ দেওয়া হয়, এই ডিরেক্টরি বর্তমান পাথ (Dir.pwd) এর অধীনে তৈরি হয়।
আপনি কিছু এরর পেতে পারেন:
- ডিরেক্টরি ইতিমধ্যে আছে (
Errno::EEXIST) - পারমিশন ডেনাইড (
Errno::EACCES) - আপনি এমন একটি ফোল্ডারের অধীনে ফোল্ডার তৈরি করার চেষ্টা করছেন যা এখনো অস্তিত্বে নেই (
Errno::ENOENT)
শেষের এরর সাধারণত তখন হয় যখন আপনি নেস্টেড ডিরেক্টরি তৈরি করার চেষ্টা করেন।
অথবা আপনি একটি অ্যাসোলিউট পাথ ব্যবহার করছেন যা অস্তিত্বে নেই।
দুটি সমাধান:
- তবেreating előtt চেক করুন ডিরেক্টরি আছে কিনা (
Dir.exists?দিয়ে) - একটি আরও উন্নত ক্লাস ব্যবহার করুন (পরবর্তী সেকশন)
চলুন শিখতে থাকি!
FileUtils মডিউলের সাথে উন্নত অপারেশন
আপনি যদি একটু এক্সট্রা হর্সপাওয়ার দরকার হয়, আপনি স্ট্যান্ডার্ড লাইব্রেরি থেকে FileUtils মডিউল আনার পারেন।
এতে mkdir_p মতো মেথড আছে যা একই স্টেপে নেস্টেড ডিরেক্টরি তৈরি করে।
এখানে একটি উদাহরণ:
require 'fileutils' FileUtils.mkdir_p("/tmp/testing/a/b") খুব কুল, ঠিক না?
এটিই সব নয়, FileUtils সকল ফাইল অপারেশনের জন্য কিওয়ার্ড আর্গুমেন্টের রূপে এক্সট্রা অপশনও আনে। যেমন verbose অপশন (লিনাক্স কমান্ড প্রিন্ট করে) এবং noop (ফাইল পরিবর্তন করুন না) অপশন।
এটি ট্রাই করুন!
ডিরেক্টরি রিনেম করা
রুবি আপনাকে সকল অপারেশন করতে দেয় যা আপনি আপনার অপারেটিং সিস্টেম ইউজার ইন্টারফেস থেকে, বা একটি টার্মিনাল থেকে করতে পারেন।
উদাহরণস্বরূপ…
আপনি একটি ডিরেক্টরি এইভাবে রিনেম করতে পারেন:
FileUtils.mv("/tmp/a", "/tmp/b") এখানও আপনাকে FileUtils ব্যবহার করতে হবে কারণ mv Dir ক্লাসে উপলব্ধ নয়।
আপনার বর্তমান ডিরেক্টরি পরিবর্তন করা
যেহেতু সকল ডিরেক্টরি অপারেশন বর্তমান ডিরেক্টরি থেকে রান হয়, আপনি এটি পরিবর্তন করতে চাইতে পারেন।
আপনি Dir.chdir মেথড ব্যবহার করে এটি করতে পারেন।
উদাহরণ:
Dir.chdir("/tmp") { Dir.entries(".") } এটি দুভাবেই কাজ করে:
- একটি ব্লকের সাথে, বর্তমান ডিরেক্টরি শুধু ব্লকের ভিতরের কোডের জন্য পরিবর্তিত হয়
- ব্লক ছাড়া, এটি মেথড কলের পরের সকল কোডের জন্য পরিবর্তিত হয়
লক্ষ্য করুন যে chdir শুধু আপনার রুবি প্রসেসের ভিতরে কাজ করে, এটি “বাইরের ওয়ার্ল্ড”-কে প্রভাবিত করে না।
অন্য কথায়…
আপনার রুবি প্রোগ্রাম বন্ধ হওয়ার পর এটি আপনার শেলের ওয়ার্কিং ডিরেক্টরি পরিবর্তন করবে না।
প্যাটার্ন ম্যাচিং দিয়ে ফাইল ও ডিরেক্টরি লিস্ট করা
এক ফোল্ডারে সকল রুবি ফাইল খুঁজতে চান? glob মেথড দিয়ে সহজ কাজ!
উদাহরণ:
Dir.glob("*.rb") আপনি যেকোনো অন্য এক্সটেনশন ব্যবহার করতে পারেন, যেমন “.txt”, বা “.yml”। বা ফাইল নামের যেকোনো অংশ।
সকল ফোল্ডারের ভিতর ফাইল খুঁজতে চান?
হ্যাঁ, এটিই সম্ভব:
Dir.glob("**/*.rb") রেজাল্ট হলো একটি অ্যারে যেখানে সব ফাইলনেম রিলেটিভ পাথসহ থাকে। আপনি পাথ রিমুভ করে শুধু ফাইলনেম পেতে পারেন File.basename মেথড ব্যবহার করে glob- থেকে পাওয়া লিস্টের প্রতিটি ফাইলে।
সারাংশ
আপনি রুবিতে Dir এবং FileUtils ক্লাস ব্যবহার করে ডিরেক্টরি নিয়ে কাজ করা শিখেছেন।
এখন আপনার বاری এটি প্র্যাকটিসে লাগানোর।
পড়ার জন্য ধন্যবাদ! 🙂