ফাইল নিয়ে কাজ করার ফাংশনগুলো File মডিউলে দেওয়া আছে।
পুরো একটি ফাইল পড়তে File.read/1 ব্যবহার করুন। ফাইলে লিখতে File.write/2 ব্যবহার করুন।
প্রতিবার File.write/2 দিয়ে কোনো ফাইলে লেখা হলে একটি ফাইল ডেসক্রিপ্টর খোলা হয় এবং একটি নতুন Elixir প্রসেস তৈরি হয়। এই কারণে লুপের ভেতরে File.write/2 দিয়ে ফাইলে লেখা এড়িয়ে চলা উচিত।
তার বদলে File.open/2 দিয়ে ফাইল খোলা যায়। File.open/2-এর দ্বিতীয় আর্গুমেন্টটি মোডের একটি তালিকা, যার মাধ্যমে আপনি ঠিক করতে পারেন ফাইলটি পড়ার জন্য খুলবেন, না লেখার জন্য।
File.open/2 ফাইলটি সামলানো প্রসেসের একটি PID রিটার্ন করে। ফাইলটি পড়তে ও লিখতে IO মডিউলের ফাংশনগুলো ব্যবহার করুন এবং এই PID-টি IO ডিভাইস হিসেবে পাস করুন।
ফাইলের কাজ শেষ হলে File.close/1 দিয়ে এটি বন্ধ করুন।
File মডিউলের উপরে উল্লেখিত সব ফাংশনেরই একটি ! সংস্করণ আছে, যা এরর টাপল রিটার্ন করার বদলে একটি এরর রেইজ করে (যেমন File.read!/1)। ফাইল না থাকা বা অনুমতি না থাকার মতো এরর আপনি যদি হ্যান্ডল করতে না চান, তবে ওই সংস্করণটি ব্যবহার করুন।
আপনি মডেল ট্রেনের একজন বড় ভক্ত এবং আপনার এই শখ সবার সাথে ভাগ করে নেওয়ার জন্য একটি নিউজলেটার শুরু করার সিদ্ধান্ত নিয়েছেন। শুরুতে আপনি আপনার শখ ভাগ করে নেন এমন বন্ধু ও পরিচিতজনদের কাছে নিউজলেটারের প্রথম সংখ্যাটি পাঠাবেন। আপনার কাছে তাদের ইমেইল ঠিকানা সম্বলিত একটি টেক্সট ফাইল আছে।
Newsletter.read_emails/1 ফাংশনটি ইমপ্লিমেন্ট করুন। এটি একটি ফাইলের পাথ নেবে। ফাইলটি একটি টেক্সট ফাইল, যাতে নিউলাইন দিয়ে আলাদা করা ইমেইল ঠিকানা থাকে। ফাংশনটি ফাইল থেকে পাওয়া ইমেইল ঠিকানাগুলোর একটি অ্যারে রিটার্ন করবে।
Newsletter.read_emails("/home/my_user/documents/model_train_friends_emails.txt")
# => ["rick@example.com", "choochoo42@example.com", "anna@example.com"]
ইমেইল পাঠানো এমন একটি কাজ, যা অনেক অপ্রত্যাশিত কারণে ব্যর্থ হতে পারে, যেমন ইমেইল ঠিকানায় টাইপো বা সাময়িক নেটওয়ার্ক সমস্যা। ডুপ্লিকেট না পাঠিয়ে আপনার সব বন্ধুকে আবার ইমেইল পাঠানোর চেষ্টা যাতে করতে পারেন, সেজন্য যারা ইতিমধ্যে ইমেইল পেয়ে গেছে তাদের ঠিকানা লগ করে রাখতে হবে। এর জন্য আপনার একটি লগ ফাইল দরকার।
Newsletter.open_log/1 ফাংশনটি ইমপ্লিমেন্ট করুন। এটি একটি ফাইলের পাথ নেবে, লেখার জন্য ফাইলটি খুলবে এবং ফাইলটি সামলানো প্রসেসের PID রিটার্ন করবে।
Newsletter.open_log("/home/my_user/documents/newsletter_issue1_log.txt")
# => #PID<0.145.0>
Newsletter.log_sent_email/2 ফাংশনটি ইমপ্লিমেন্ট করুন। এটি ফাইলটি সামলানো প্রসেসের একটি PID এবং ইমেইল ঠিকানা সম্বলিত একটি স্ট্রিং নেবে। এটি ফাইলে ইমেইল ঠিকানাটি লিখবে, তারপর একটি নিউলাইন।
Newsletter.log_sent_email(pid, "joe@example.com")
# => :ok
Newsletter.close_log/1 ফাংশনটি ইমপ্লিমেন্ট করুন। এটি ফাইলটি সামলানো প্রসেসের একটি PID নেবে এবং ফাইলটি বন্ধ করবে।
Newsletter.close_log(pid)
# => :ok
এখন ইমেইল পাঠানোর প্রক্রিয়ার সব উপাদান আপনার হাতে এসে গেছে, এবার সেগুলোকে একটি ফাংশনে একত্র করতে হবে।
Newsletter.send_newsletter/3 ফাংশনটি ইমপ্লিমেন্ট করুন। এটি ইমেইল ঠিকানা সম্বলিত ফাইলের একটি পাথ, একটি লগ ফাইলের পাথ এবং একটি অ্যানোনিমাস ফাংশন নেবে, যা নির্দিষ্ট একটি ইমেইল ঠিকানায় ইমেইল পাঠায়। এটি প্রদত্ত ফাইল থেকে সব ইমেইল ঠিকানা পড়বে এবং সেগুলোর প্রত্যেকটিতে ইমেইল পাঠানোর চেষ্টা করবে। ইমেইল পাঠানো অ্যানোনিমাস ফাংশনটি যদি :ok রিটার্ন করে, তাহলে ইমেইল ঠিকানাটি লগ ফাইলে লিখবে, তারপর একটি নতুন লাইন। ইমেইল পাঠানোর সাথে সাথেই যেন এটি করা হয় সেদিকে খেয়াল রাখুন। সব পাঠানো শেষ হলে লগ ফাইলটি বন্ধ করবে।
Newsletter.send_newsletter(
"model_train_friends_emails.txt",
"newsletter_issue1_log.txt",
fn email -> :ok end
)
# => :ok
Exercism-এ সাইন আপ করুন, Elixir ট্র্যাকের 58টি কনসেপ্ট168টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।