As funções para trabalhar com arquivos são fornecidas pelo módulo File.
Para ler um arquivo inteiro, use File.read/1. Para escrever em um arquivo, use File.write/2.
Toda vez que você escreve em um arquivo com File.write/2, um descritor de arquivo é aberto e um novo processo do Elixir é criado. Por esse motivo, evite escrever em um arquivo dentro de um laço com File.write/2.
Em vez disso, você pode abrir um arquivo com File.open/2. O segundo argumento de File.open/2 é uma lista de modos, que permite especificar se você quer abrir o arquivo para leitura ou para escrita.
File.open/2 retorna o PID de um processo que cuida do arquivo. Para ler e escrever no arquivo, use as funções do módulo IO e passe esse PID como o dispositivo de IO.
Quando terminar de trabalhar com o arquivo, feche-o com File.close/1.
Todas as funções do módulo File mencionadas acima também têm uma variante com ! que lança um erro em vez de retornar uma tupla de erro (por exemplo, File.read!/1). Use essa variante se você não pretende tratar erros como arquivos inexistentes ou falta de permissão.
Você é um grande entusiasta de trens em miniatura e decidiu compartilhar sua paixão com o mundo criando uma newsletter. Você vai começar enviando a primeira edição da sua newsletter para seus amigos e conhecidos que compartilham o mesmo hobby. Você tem um arquivo de texto com uma lista dos endereços de email deles.
Implemente a função Newsletter.read_emails/1. Ela deve receber um caminho de arquivo. O arquivo é um arquivo de texto que contém endereços de email separados por quebras de linha. A função deve retornar uma lista com os endereços de email do arquivo.
Newsletter.read_emails("/home/my_user/documents/model_train_friends_emails.txt")
# => ["rick@example.com", "choochoo42@example.com", "anna@example.com"]
Enviar um email é uma tarefa que pode falhar por vários motivos imprevisíveis, como um erro de digitação no endereço de email ou problemas temporários de rede. Para garantir que você consiga tentar enviar os emails para todos os seus amigos de novo sem enviar duplicatas, você precisa registrar os endereços de email que já receberam o email. Para isso, você vai precisar de um arquivo de log.
Implemente a função Newsletter.open_log/1. Ela deve receber um caminho de arquivo, abrir o arquivo para escrita e retornar o PID do processo que cuida do arquivo.
Newsletter.open_log("/home/my_user/documents/newsletter_issue1_log.txt")
# => #PID<0.145.0>
Implemente a função Newsletter.log_sent_email/2. Ela deve receber um PID do processo que cuida do arquivo e uma string com o endereço de email. Ela deve escrever o endereço de email no arquivo, seguido de uma quebra de linha.
Newsletter.log_sent_email(pid, "joe@example.com")
# => :ok
Implemente a função Newsletter.close_log/1. Ela deve receber um PID do processo que cuida do arquivo e fechar o arquivo.
Newsletter.close_log(pid)
# => :ok
Agora que você já tem todos os blocos de construção do procedimento de envio de email, precisa juntá-los em uma única função.
Implemente a função Newsletter.send_newsletter/3. Ela deve receber o caminho do arquivo com os endereços de email, o caminho de um arquivo de log e uma função anônima que envia um email para um determinado endereço de email. Ela deve ler todos os endereços de email do arquivo informado e tentar enviar um email para cada um deles. Se a função anônima que envia o email retornar :ok, escreva o endereço de email no arquivo de log, seguido de uma quebra de linha. Certifique-se de fazer isso assim que o email for enviado. Depois de terminar todos os envios, feche o arquivo de log.
Newsletter.send_newsletter(
"model_train_friends_emails.txt",
"newsletter_issue1_log.txt",
fn email -> :ok end
)
# => :ok
Crie sua conta no Exercism para aprender e dominar Elixir com 58 conceitos168 exercícios e mentoria humana de verdade, tudo de graça.