Il modulo File fornisce le funzioni per lavorare con i file.
Per leggere un intero file, usa File.read/1. Per scrivere su un file, usa File.write/2.
Ogni volta che si scrive su un file con File.write/2, viene aperto un descrittore di file. Viene anche avviato un nuovo processo Elixir. Per questo motivo, è meglio evitare di scrivere su un file in un ciclo usando File.write/2.
Invece, si può aprire un file usando File.open/2. Il secondo argomento di File.open/2 è una lista di modalità, che permette di specificare se si vuole aprire il file in lettura o in scrittura.
File.open/2 restituisce un PID di un processo che gestisce il file. Per leggere e scrivere sul file, usa le funzioni del modulo IO e passa questo PID come dispositivo IO.
Quando hai finito di lavorare con il file, chiudilo con File.close/1.
Tutte le funzioni menzionate del modulo File hanno anche una variante ! che solleva un errore invece di restituire una tupla di errore (ad esempio File.read!/1). Usa quella variante se non hai intenzione di gestire errori come file mancanti o mancanza di permessi.
Sei un grande appassionato di modellismo ferroviario e hai deciso di condividere la tua passione con il mondo lanciando una newsletter. Per iniziare, invierai il primo numero della tua newsletter agli amici e ai conoscenti che condividono il tuo hobby. Hai un file di testo con un elenco dei loro indirizzi email.
Implementa la funzione Newsletter.read_emails/1. Deve accettare un percorso di file. Il file è un file di testo che contiene indirizzi email separati da caratteri di nuova riga. La funzione deve restituire un array con gli indirizzi email contenuti nel file.
Newsletter.read_emails("/home/my_user/documents/model_train_friends_emails.txt")
# => ["rick@example.com", "choochoo42@example.com", "anna@example.com"]
Inviare un'email è un'operazione che può fallire per molti motivi imprevedibili, come un refuso nell'indirizzo email o problemi temporanei di rete. Per poter ritentare l'invio delle email a tutti i tuoi amici senza inviarne di duplicate, devi registrare gli indirizzi email che hanno già ricevuto l'email. Per farlo, ti serve un file di log.
Implementa la funzione Newsletter.open_log/1. Deve accettare un percorso di file, aprire il file in scrittura e restituire il PID del processo che gestisce il file.
Newsletter.open_log("/home/my_user/documents/newsletter_issue1_log.txt")
# => #PID<0.145.0>
Implementa la funzione Newsletter.log_sent_email/2. Deve accettare il PID del processo che gestisce il file e una stringa con l'indirizzo email. Deve scrivere l'indirizzo email nel file, seguito da un carattere di nuova riga.
Newsletter.log_sent_email(pid, "joe@example.com")
# => :ok
Implementa la funzione Newsletter.close_log/1. Deve accettare il PID del processo che gestisce il file e chiudere il file.
Newsletter.close_log(pid)
# => :ok
Ora che hai tutti i pezzi che compongono la procedura di invio delle email, devi combinarli in un'unica funzione.
Implementa la funzione Newsletter.send_newsletter/3. Deve accettare il percorso del file con gli indirizzi email, il percorso di un file di log e una funzione anonima che invia un'email a un dato indirizzo email. Deve leggere tutti gli indirizzi email dal file indicato e provare a inviare un'email a ognuno di essi. Se la funzione anonima che invia l'email restituisce :ok, scrivi l'indirizzo email nel file di log, seguito da un carattere di nuova riga. Assicurati di farlo non appena l'email è stata inviata. Dopo aver terminato tutti gli invii, chiudi il file di log.
Newsletter.send_newsletter(
"model_train_friends_emails.txt",
"newsletter_issue1_log.txt",
fn email -> :ok end
)
# => :ok
Iscriviti a Exercism per imparare e padroneggiare Elixir con 58 concetti168 esercizi e il mentoring di persone reali, tutto gratis.