Το module File παρέχει συναρτήσεις για να δουλεύεις με αρχεία.
Για να διαβάσεις ολόκληρο ένα αρχείο, χρησιμοποίησε το File.read/1. Για να γράψεις σε ένα αρχείο, χρησιμοποίησε το File.write/2.
Κάθε φορά που γράφεις σε ένα αρχείο με το File.write/2, ανοίγει ένας περιγραφέας αρχείου και δημιουργείται μια νέα διεργασία της Elixir. Γι' αυτόν τον λόγο, καλό είναι να αποφεύγεις το γράψιμο σε αρχείο μέσα σε βρόχο με το File.write/2.
Αντ' αυτού, μπορείς να ανοίξεις ένα αρχείο με το File.open/2. Το δεύτερο όρισμα του File.open/2 είναι μια λίστα με λειτουργίες, που σου επιτρέπει να ορίσεις αν θέλεις να ανοίξεις το αρχείο για διάβασμα ή για γράψιμο.
Το File.open/2 επιστρέφει ένα PID μιας διεργασίας που διαχειρίζεται το αρχείο. Για να διαβάσεις και να γράψεις στο αρχείο, χρησιμοποίησε συναρτήσεις από το module IO και πέρασε αυτό το PID ως τη συσκευή IO.
Όταν τελειώσεις με το αρχείο, κλείσε το με το File.close/1.
Όλες οι συναρτήσεις του module File που αναφέρθηκαν έχουν και μια παραλλαγή με ! που πετάει ένα σφάλμα αντί να επιστρέψει μια πλειάδα σφάλματος (π.χ. File.read!/1). Χρησιμοποίησε αυτή την παραλλαγή αν δε σκοπεύεις να χειριστείς σφάλματα όπως αρχεία που λείπουν ή έλλειψη δικαιωμάτων.
Είσαι λάτρης των μοντέλων τρένων και αποφάσισες να μοιραστείς το πάθος σου με τον κόσμο ξεκινώντας ένα newsletter. Θα ξεκινήσεις στέλνοντας το πρώτο τεύχος του newsletter σου στους φίλους και τις γνωριμίες σου που μοιράζονται το χόμπι σου. Έχεις ένα αρχείο κειμένου με μια λίστα με τις διευθύνσεις email τους.
Υλοποίησε τη συνάρτηση Newsletter.read_emails/1. Πρέπει να δέχεται μια διαδρομή αρχείου. Το αρχείο είναι ένα αρχείο κειμένου που περιέχει διευθύνσεις email χωρισμένες με αλλαγές γραμμής. Η συνάρτηση πρέπει να επιστρέφει μια λίστα με τις διευθύνσεις email του αρχείου.
Newsletter.read_emails("/home/my_user/documents/model_train_friends_emails.txt")
# => ["rick@example.com", "choochoo42@example.com", "anna@example.com"]
Το να στέλνεις ένα email είναι μια εργασία που μπορεί να αποτύχει για πολλούς απρόβλεπτους λόγους, όπως ένα τυπογραφικό λάθος στη διεύθυνση email ή προσωρινά προβλήματα δικτύου. Για να μπορείς να ξαναπροσπαθήσεις να στείλεις τα email σε όλους τους φίλους σου χωρίς να στείλεις διπλότυπα, πρέπει να καταγράφεις τις διευθύνσεις email που έλαβαν ήδη το email. Για αυτό, θα χρειαστείς ένα αρχείο καταγραφής.
Υλοποίησε τη συνάρτηση 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 της διεργασίας που διαχειρίζεται το αρχείο και μια συμβολοσειρά με τη διεύθυνση email. Πρέπει να γράφει τη διεύθυνση email στο αρχείο, ακολουθούμενη από μια αλλαγή γραμμής.
Newsletter.log_sent_email(pid, "joe@example.com")
# => :ok
Υλοποίησε τη συνάρτηση Newsletter.close_log/1. Πρέπει να δέχεται το PID της διεργασίας που διαχειρίζεται το αρχείο και να κλείνει το αρχείο.
Newsletter.close_log(pid)
# => :ok
Τώρα που έχεις όλα τα δομικά στοιχεία της διαδικασίας αποστολής email, πρέπει να τα συνδυάσεις όλα σε μία συνάρτηση.
Υλοποίησε τη συνάρτηση Newsletter.send_newsletter/3. Πρέπει να δέχεται τη διαδρομή του αρχείου με τις διευθύνσεις email, τη διαδρομή ενός αρχείου καταγραφής και μια ανώνυμη συνάρτηση που στέλνει ένα email σε μια δεδομένη διεύθυνση email. Πρέπει να διαβάζει όλες τις διευθύνσεις email από το δοσμένο αρχείο και να επιχειρεί να στείλει ένα email σε καθεμία από αυτές. Αν η ανώνυμη συνάρτηση που στέλνει το email επιστρέφει :ok, γράψε τη διεύθυνση email στο αρχείο καταγραφής, ακολουθούμενη από μια αλλαγή γραμμής. Φρόντισε να το κάνεις μόλις σταλεί το email. Αφού ολοκληρωθεί η αποστολή, κλείσε το αρχείο καταγραφής.
Newsletter.send_newsletter(
"model_train_friends_emails.txt",
"newsletter_issue1_log.txt",
fn email -> :ok end
)
# => :ok
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Elixir με 58 έννοιες168 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.