توفّر وحدة 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 ومرّر معرّف العملية هذا كجهاز إدخال/إخراج.
عندما تنتهي من العمل على الملف، أغلقه باستخدام 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. يجب أن تأخذ مسار ملف، وتفتح الملف للكتابة فيه، وتُرجع معرّف العملية التي تتعامل مع الملف.
Newsletter.open_log("/home/my_user/documents/newsletter_issue1_log.txt")
# => #PID<0.145.0>
نفّذ دالة Newsletter.log_sent_email/2. يجب أن تأخذ معرّف العملية التي تتعامل مع الملف وسلسلة نصية تحتوي على عنوان البريد الإلكتروني. ينبغي أن تكتب عنوان البريد الإلكتروني في الملف، متبوعًا بسطر جديد.
Newsletter.log_sent_email(pid, "joe@example.com")
# => :ok
نفّذ دالة Newsletter.close_log/1. يجب أن تأخذ معرّف العملية التي تتعامل مع الملف وتغلق الملف.
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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.