Les fonctions permettant de travailler avec des fichiers sont fournies par le module File.
Pour lire un fichier entier, utilise File.read/1. Pour écrire dans un fichier, utilise File.write/2.
Chaque fois qu'on écrit dans un fichier avec File.write/2, un descripteur de fichier est ouvert et un nouveau processus Elixir est lancé. C'est pourquoi il faut éviter d'écrire dans un fichier en boucle avec File.write/2.
À la place, on peut ouvrir un fichier avec File.open/2. Le deuxième argument de File.open/2 est un tableau de modes, ce qui permet de préciser si l'on veut ouvrir le fichier en lecture ou en écriture.
File.open/2 renvoie un PID d'un processus qui gère le fichier. Pour lire et écrire dans le fichier, utilise les fonctions du module IO et passe ce PID comme périphérique d'E/S.
Lorsque tu as fini de travailler avec le fichier, ferme-le avec File.close/1.
Toutes les fonctions mentionnées du module File ont aussi une variante ! qui lève une erreur au lieu de renvoyer un tuple d'erreur (par exemple File.read!/1). Utilise cette variante si tu ne comptes pas gérer des erreurs telles que les fichiers manquants ou l'absence de permissions.
Tu es un grand passionné de trains miniatures et tu as décidé de partager ta passion avec le monde en lançant une newsletter. Pour commencer, tu vas envoyer le premier numéro de ta newsletter à tes amis et connaissances qui partagent ton hobby. Tu disposes d'un fichier texte contenant la liste de leurs adresses e-mail.
Implémente la fonction Newsletter.read_emails/1. Elle prend un chemin de fichier. Le fichier est un fichier texte qui contient des adresses e-mail séparées par des retours à la ligne. La fonction doit renvoyer la liste des adresses e-mail contenues dans le fichier.
Newsletter.read_emails("/home/my_user/documents/model_train_friends_emails.txt")
# => ["rick@example.com", "choochoo42@example.com", "anna@example.com"]
Envoyer un e-mail est une tâche qui peut échouer pour de nombreuses raisons imprévisibles, comme une faute de frappe dans l'adresse e-mail ou des problèmes de réseau temporaires. Pour pouvoir réessayer d'envoyer les e-mails à tous tes amis sans en envoyer deux fois, tu dois consigner les adresses e-mail qui ont déjà reçu l'e-mail. Pour cela, tu auras besoin d'un fichier de log.
Implémente la fonction Newsletter.open_log/1. Elle prend un chemin de fichier, ouvre le fichier en écriture et renvoie le PID du processus qui gère le fichier.
Newsletter.open_log("/home/my_user/documents/newsletter_issue1_log.txt")
# => #PID<0.145.0>
Implémente la fonction Newsletter.log_sent_email/2. Elle prend un PID du processus qui gère le fichier et une string contenant l'adresse e-mail. Elle doit écrire l'adresse e-mail dans le fichier, suivie d'un retour à la ligne.
Newsletter.log_sent_email(pid, "joe@example.com")
# => :ok
Implémente la fonction Newsletter.close_log/1. Elle prend un PID du processus qui gère le fichier et ferme le fichier.
Newsletter.close_log(pid)
# => :ok
Maintenant que tu disposes de toutes les briques de la procédure d'envoi des e-mails, tu dois les assembler dans une seule fonction.
Implémente la fonction Newsletter.send_newsletter/3. Elle prend un chemin du fichier contenant les adresses e-mail, un chemin d'un fichier de log et une fonction anonyme qui envoie un e-mail à une adresse e-mail donnée. Elle doit lire toutes les adresses e-mail du fichier donné et tenter d'envoyer un e-mail à chacune d'elles. Si la fonction anonyme qui envoie l'e-mail renvoie :ok, écris l'adresse e-mail dans le fichier de log, suivie d'un retour à la ligne. Assure-toi de le faire dès que l'e-mail est envoyé. Une fois tous les envois terminés, ferme le fichier de log.
Newsletter.send_newsletter(
"model_train_friends_emails.txt",
"newsletter_issue1_log.txt",
fn email -> :ok end
)
# => :ok
Inscris-toi sur Exercism pour apprendre et maîtriser Elixir avec 58 concepts168 exercices, et un vrai mentorat humain, le tout gratuitement.