Funktionen für die Arbeit mit Dateien stellt das Modul File bereit.
Um eine ganze Datei zu lesen, verwende File.read/1. Um in eine Datei zu schreiben, verwende File.write/2.
Jedes Mal, wenn mit File.write/2 in eine Datei geschrieben wird, wird ein Dateideskriptor geöffnet und ein neuer Elixir-Prozess gestartet. Aus diesem Grund solltest du es vermeiden, in einer Schleife mit File.write/2 in eine Datei zu schreiben.
Stattdessen kannst du eine Datei mit File.open/2 öffnen. Das zweite Argument von File.open/2 ist eine Liste von Modi, mit der du angeben kannst, ob du die Datei zum Lesen oder zum Schreiben öffnen möchtest.
File.open/2 gibt die PID eines Prozesses zurück, der die Datei verwaltet. Um in die Datei zu lesen und zu schreiben, verwendest du Funktionen aus dem Modul IO und übergibst diese PID als IO-Gerät.
Wenn du mit der Datei fertig bist, schließe sie mit File.close/1.
Alle genannten Funktionen aus dem Modul File haben auch eine !-Variante, die einen Fehler auslöst, anstatt ein Fehler-Tupel zurückzugeben (z. B. File.read!/1). Verwende diese Variante, wenn du nicht vorhast, Fehler wie fehlende Dateien oder fehlende Berechtigungen zu behandeln.
Du bist ein großer Fan von Modelleisenbahnen und hast beschlossen, deine Leidenschaft mit der Welt zu teilen, indem du einen Newsletter startest. Zum Anfang schickst du die erste Ausgabe deines Newsletters an deine Freunde und Bekannten, die dein Hobby teilen. Du hast eine Textdatei mit einer Liste ihrer E-Mail-Adressen.
Implementiere die Funktion Newsletter.read_emails/1. Sie erwartet einen Dateipfad. Die Datei ist eine Textdatei, die E-Mail-Adressen enthält, die durch Zeilenumbrüche getrennt sind. Die Funktion gibt eine Liste der E-Mail-Adressen aus der Datei zurück.
Newsletter.read_emails("/home/my_user/documents/model_train_friends_emails.txt")
# => ["rick@example.com", "choochoo42@example.com", "anna@example.com"]
Das Senden einer E-Mail ist eine Aufgabe, die aus vielen unvorhersehbaren Gründen fehlschlagen kann, zum Beispiel wegen eines Tippfehlers in der E-Mail-Adresse oder vorübergehender Netzwerkprobleme. Damit du das Senden der E-Mails an alle deine Freunde wiederholen kannst, ohne Duplikate zu verschicken, musst du die E-Mail-Adressen protokollieren, die die E-Mail bereits erhalten haben. Dafür brauchst du eine Logdatei.
Implementiere die Funktion Newsletter.open_log/1. Sie erwartet einen Dateipfad, öffnet die Datei zum Schreiben und gibt die PID des Prozesses zurück, der die Datei verwaltet.
Newsletter.open_log("/home/my_user/documents/newsletter_issue1_log.txt")
# => #PID<0.145.0>
Implementiere die Funktion Newsletter.log_sent_email/2. Sie erwartet die PID des Prozesses, der die Datei verwaltet, und einen String mit der E-Mail-Adresse. Sie schreibt die E-Mail-Adresse in die Datei, gefolgt von einem Zeilenumbruch.
Newsletter.log_sent_email(pid, "joe@example.com")
# => :ok
Implementiere die Funktion Newsletter.close_log/1. Sie erwartet die PID des Prozesses, der die Datei verwaltet, und schließt die Datei.
Newsletter.close_log(pid)
# => :ok
Jetzt, wo du alle Bausteine für das Versenden der E-Mails hast, musst du sie in einer einzigen Funktion zusammenführen.
Implementiere die Funktion Newsletter.send_newsletter/3. Sie erwartet den Pfad der Datei mit den E-Mail-Adressen, den Pfad einer Logdatei und eine anonyme Funktion, die eine E-Mail an eine bestimmte E-Mail-Adresse sendet. Sie liest alle E-Mail-Adressen aus der angegebenen Datei und versucht, an jede von ihnen eine E-Mail zu senden. Wenn die anonyme Funktion, die die E-Mail sendet, :ok zurückgibt, schreibe die E-Mail-Adresse in die Logdatei, gefolgt von einem Zeilenumbruch. Achte darauf, dass du das sofort tust, sobald die E-Mail gesendet wurde. Nachdem alle E-Mails gesendet wurden, schließe die Logdatei.
Newsletter.send_newsletter(
"model_train_friends_emails.txt",
"newsletter_issue1_log.txt",
fn email -> :ok end
)
# => :ok
Melde dich bei Exercism an, um Elixir mit 58 Konzepte168 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.