A fájlokkal való munkához szükséges függvényeket a File modul biztosítja.
Egy teljes fájl beolvasásához használd a File.read/1 függvényt. Fájlba íráshoz a File.write/2 függvényt használd.
Valahányszor File.write/2-vel írsz fájlba, megnyílik egy fájlleíró, és elindul egy új Elixir folyamat. Ezért érdemes elkerülni, hogy ciklusban File.write/2-vel írj fájlba.
Ehelyett a fájlt a File.open/2 függvénnyel nyithatod meg. A File.open/2 második argumentuma a módok listája, amellyel megadhatod, hogy olvasásra vagy írásra szeretnéd megnyitni a fájlt.
A File.open/2 egy folyamat PID-jét adja vissza, amely kezeli a fájlt. A fájl olvasásához és írásához az IO modul függvényeit használd, és add át ezt a PID-et IO-eszközként.
Amikor végeztél a fájllal, zárd be a File.close/1 függvénnyel.
A File modul összes említett függvényének van egy ! jelű változata is, amely hibát dob ahelyett, hogy egy hibát jelző tuple-t adna vissza (például File.read!/1). Ezt a változatot akkor használd, ha nem akarod kezelni az olyan hibákat, mint a hiányzó fájlok vagy a hiányzó jogosultságok.
Nagy modellvasút-rajongó vagy, és úgy döntöttél, hogy egy hírlevél elindításával megosztod a szenvedélyedet a világgal. Azzal kezded, hogy elküldöd a hírlevél első számát azoknak a barátaidnak és ismerőseidnek, akik osztoznak a hobbidban. Van egy szövegfájlod, amely az e-mail-címeik listáját tartalmazza.
Valósítsd meg a Newsletter.read_emails/1 függvényt. Paraméterként egy fájl elérési útját kapja. A fájl egy szövegfájl, amely újsorokkal elválasztott e-mail-címeket tartalmaz. A függvény adja vissza a fájlban szereplő e-mail-címek listáját.
Newsletter.read_emails("/home/my_user/documents/model_train_friends_emails.txt")
# => ["rick@example.com", "choochoo42@example.com", "anna@example.com"]
Egy e-mail elküldése sok kiszámíthatatlan okból meghiúsulhat, például egy elgépelt e-mail-cím vagy átmeneti hálózati problémák miatt. Ahhoz, hogy újra megpróbálhasd elküldeni az e-maileket mindenkinek, anélkül hogy duplikátumokat küldenél, naplóznod kell azokat az e-mail-címeket, amelyek már megkapták az e-mailt. Ehhez szükséged lesz egy naplófájlra.
Valósítsd meg a Newsletter.open_log/1 függvényt. Paraméterként egy fájl elérési útját kapja, megnyitja a fájlt írásra, és visszaadja a fájlt kezelő folyamat PID-jét.
Newsletter.open_log("/home/my_user/documents/newsletter_issue1_log.txt")
# => #PID<0.145.0>
Valósítsd meg a Newsletter.log_sent_email/2 függvényt. Paraméterként a fájlt kezelő folyamat PID-jét és az e-mail-címet tartalmazó stringet kapja. Kiírja az e-mail-címet a fájlba, majd egy újsort.
Newsletter.log_sent_email(pid, "joe@example.com")
# => :ok
Valósítsd meg a Newsletter.close_log/1 függvényt. Paraméterként a fájlt kezelő folyamat PID-jét kapja, és bezárja a fájlt.
Newsletter.close_log(pid)
# => :ok
Most, hogy megvan az e-mail-küldés minden építőeleme, egyetlen függvényben kell összekapcsolnod őket.
Valósítsd meg a Newsletter.send_newsletter/3 függvényt. Paraméterként az e-mail-címeket tartalmazó fájl elérési útját, egy naplófájl elérési útját és egy névtelen függvényt kap, amely elküld egy e-mailt egy adott e-mail-címre. Beolvassa az összes e-mail-címet a megadott fájlból, és megpróbál e-mailt küldeni mindegyikre. Ha az e-mailt küldő névtelen függvény :ok értékkel tér vissza, írd ki az e-mail-címet a naplófájlba, majd egy újsort. Ezt mindenképpen rögtön az e-mail elküldése után tedd meg. Miután minden elküldéssel végeztél, zárd be a naplófájlt.
Newsletter.send_newsletter(
"model_train_friends_emails.txt",
"newsletter_issue1_log.txt",
fn email -> :ok end
)
# => :ok
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Elixir nyelvet 58 fogalom168 feladat segítségével, valódi emberi mentorálással, mindez ingyen.