파일을 다루는 함수는 File 모듈에서 제공해요.
파일 전체를 읽으려면 File.read/1을 사용해요. 파일에 쓰려면 File.write/2를 사용해요.
File.write/2로 파일에 쓸 때마다 파일 디스크립터가 열리고 새로운 Elixir 프로세스가 생성돼요. 이런 이유로, 루프 안에서 File.write/2를 사용해 파일에 쓰는 것은 피해야 해요.
대신 File.open/2로 파일을 열 수 있어요. File.open/2의 두 번째 인자는 모드 목록인데, 파일을 읽기용으로 열지 쓰기용으로 열지 지정할 수 있어요.
File.open/2는 파일을 다루는 프로세스의 PID를 반환해요. 파일을 읽고 쓰려면 IO 모듈의 함수를 사용하고, 이 PID를 IO 장치로 넘겨줘요.
파일 작업을 마치면 File.close/1으로 파일을 닫아요.
File 모듈의 앞서 언급한 모든 함수에는 오류 튜플을 반환하는 대신 오류를 발생시키는 ! 변형도 있어요 (예: File.read!/1). 파일이 없거나 권한이 없는 등의 오류를 처리할 생각이 없다면 이 변형을 사용해요.
모형 기차를 아주 좋아하는 사람이에요. 그 열정을 세상과 나누고 싶어서 뉴스레터를 시작하기로 했어요. 먼저 이 취미를 함께하는 친구와 지인들에게 뉴스레터 첫 호를 보내는 것부터 시작할 거예요. 그들의 이메일 주소 목록이 담긴 텍스트 파일이 하나 있어요.
Newsletter.read_emails/1 함수를 구현해요. 이 함수는 파일 경로를 받아요. 파일은 이메일 주소가 줄바꿈으로 구분되어 있는 텍스트 파일이에요. 함수는 파일에서 읽은 이메일 주소의 배열을 반환해야 해요.
Newsletter.read_emails("/home/my_user/documents/model_train_friends_emails.txt")
# => ["rick@example.com", "choochoo42@example.com", "anna@example.com"]
이메일을 보내는 일은 예측할 수 없는 여러 이유로 실패할 수 있어요. 이메일 주소의 오타나 일시적인 네트워크 문제처럼요. 모든 친구에게 이메일을 다시 보낼 때 중복으로 보내지 않으려면, 이미 이메일을 받은 주소를 기록해 둬야 해요. 그러려면 로그 파일이 필요해요.
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와 이메일 주소가 담긴 문자열을 받아요. 그리고 이메일 주소를 파일에 쓰고, 그 뒤에 줄바꿈을 붙여요.
Newsletter.log_sent_email(pid, "joe@example.com")
# => :ok
Newsletter.close_log/1 함수를 구현해요. 이 함수는 파일을 다루는 프로세스의 PID를 받아 파일을 닫아요.
Newsletter.close_log(pid)
# => :ok
이제 이메일을 보내는 절차의 모든 구성 요소를 갖췄으니, 이들을 하나의 함수로 합쳐야 해요.
Newsletter.send_newsletter/3 함수를 구현해요. 이 함수는 이메일 주소가 담긴 파일의 경로, 로그 파일의 경로, 그리고 주어진 이메일 주소로 이메일을 보내는 익명 함수를 받아요. 주어진 파일에서 모든 이메일 주소를 읽고, 각 주소로 이메일 보내기를 시도해요. 이메일을 보내는 익명 함수가 :ok를 반환하면, 그 이메일 주소를 로그 파일에 쓰고 그 뒤에 줄바꿈을 붙여요. 이메일을 보내자마자 바로 기록해야 해요. 모든 전송이 끝나면 로그 파일을 닫아요.
Newsletter.send_newsletter(
"model_train_friends_emails.txt",
"newsletter_issue1_log.txt",
fn email -> :ok end
)
# => :ok
Exercism에 가입하고 Elixir 트랙을 개념 58개연습 문제 168개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.