ماژول File توابع کار با فایل را فراهم میکند.
برای خواندن کل یک فایل، از File.read/1 استفاده کنید. برای نوشتن در یک فایل، از File.write/2 استفاده کنید.
هر بار که با File.write/2 در فایلی نوشته میشود، یک توصیفگر فایل باز میشود و یک فرایند جدید الیکسر ایجاد میشود. به همین دلیل، نباید در یک حلقه با 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