El módulo File proporciona las funciones para trabajar con archivos.
Para leer un archivo completo, usa File.read/1. Para escribir en un archivo, usa File.write/2.
Cada vez que se escribe en un archivo con File.write/2, se abre un descriptor de archivo y se crea un nuevo proceso de Elixir. Por esta razón, debes evitar escribir en un archivo dentro de un bucle con File.write/2.
En su lugar, puedes abrir un archivo con File.open/2. El segundo argumento de File.open/2 es una lista de modos, que te permite especificar si quieres abrir el archivo para leer o para escribir.
File.open/2 devuelve el PID de un proceso que se encarga del archivo. Para leer y escribir en el archivo, usa las funciones del módulo IO y pasa este PID como el dispositivo de E/S.
Cuando termines de trabajar con el archivo, ciérralo con File.close/1.
Todas las funciones mencionadas del módulo File también tienen una variante con ! que lanza un error en lugar de devolver una tupla de error (por ejemplo, File.read!/1). Usa esa variante si no piensas manejar errores como archivos que no existen o falta de permisos.
Eres un gran aficionado a los trenes a escala y has decidido compartir tu pasión con el mundo lanzando un boletín. Empezarás enviando el primer número de tu boletín a tus amigos y conocidos que comparten tu afición. Tienes un archivo de texto con una lista de sus direcciones de correo electrónico.
Implementa la función Newsletter.read_emails/1. Debe recibir una ruta de archivo. El archivo es un archivo de texto que contiene direcciones de correo electrónico separadas por saltos de línea. La función debe devolver una lista con las direcciones de correo electrónico del archivo.
Newsletter.read_emails("/home/my_user/documents/model_train_friends_emails.txt")
# => ["rick@example.com", "choochoo42@example.com", "anna@example.com"]
Enviar un correo electrónico es una tarea que puede fallar por muchas razones impredecibles, como un error de escritura en la dirección de correo o problemas temporales de red. Para asegurarte de que puedes reintentar el envío de los correos a todos tus amigos sin enviar duplicados, necesitas registrar las direcciones de correo que ya recibieron el correo. Para esto, necesitarás un archivo de registro.
Implementa la función Newsletter.open_log/1. Debe recibir una ruta de archivo, abrir el archivo para escribir en él y devolver el PID del proceso que maneja el archivo.
Newsletter.open_log("/home/my_user/documents/newsletter_issue1_log.txt")
# => #PID<0.145.0>
Implementa la función Newsletter.log_sent_email/2. Debe recibir un PID del proceso que maneja el archivo y una cadena con la dirección de correo electrónico. Debe escribir la dirección de correo en el archivo, seguida de un salto de línea.
Newsletter.log_sent_email(pid, "joe@example.com")
# => :ok
Implementa la función Newsletter.close_log/1. Debe recibir un PID del proceso que maneja el archivo y cerrar el archivo.
Newsletter.close_log(pid)
# => :ok
Ahora que tienes todas las piezas del procedimiento de envío de correos, necesitas combinarlas en una sola función.
Implementa la función Newsletter.send_newsletter/3. Debe recibir una ruta del archivo con las direcciones de correo electrónico, una ruta de un archivo de registro y una función anónima que envía un correo electrónico a una dirección de correo dada. Debe leer todas las direcciones de correo del archivo dado e intentar enviar un correo a cada una de ellas. Si la función anónima que envía el correo devuelve :ok, escribe la dirección de correo en el archivo de registro, seguida de un salto de línea. Asegúrate de hacerlo en cuanto se envíe el correo. Cuando termines de enviar todo, cierra el archivo de registro.
Newsletter.send_newsletter(
"model_train_friends_emails.txt",
"newsletter_issue1_log.txt",
fn email -> :ok end
)
# => :ok
Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.