File.RenameError 예외

File.RenameError 예외

파일이나 디렉터리의 이름을 바꾸는(rename) 작업이 실패했을 때 발생하는 예외예요. 이름을 바꾸려는 대상 파일이 존재하지 않으면 이 예외가 떠요.

예를 들어 없는 파일의 이름을 바꾸려고 하면 다음처럼 에러가 나요.

iex> File.rename!("source.txt", "target.txt")
** (File.RenameError) could not rename from "source.txt" to "target.txt": no such file or directory

출처: File.RenameError exception

본문

File.rename/2File.rename!/2는 파일의 이름(경로)을 바꿔 주는 함수예요. 이때 원본 파일이 실제로 존재해야 이름을 바꿀 수 있는데, 그 파일이 없거나 경로가 잘못되면 이 예외가 발생해요.

이 예외는 문제를 파악하기 위한 공개 필드를 제공해요.

  • :source (Path.t/0) — 이름을 바꾸려는 원본 경로예요.
  • :destination (Path.t/0) — 새로 바뀌어야 할 목적지 경로예요.
  • :reason (File.posix/0) — 이름을 바꾸지 못한 이유예요.

:reason 필드를 보면 "원본이 없어서 실패한 건지"(:enoent), "권한이 없어서 실패한 건지" 같은 원인을 구분할 수 있어요. 파일을 옮기거나 이름을 갱신하는 코드에서 실패 지점을 정확히 추적할 때 유용하죠.

실무에서는 파일을 임시 이름으로 저장한 뒤, 저장이 끝나면 최종 이름으로 바꾸는 "원자적 쓰기(atomic write)" 패턴에서 이 예외를 만나기도 해요. 그런 코드라면 원본 경로와 목적지 경로 양쪽이 정상인지, 그리고 디렉터리 권한이 있는지를 함께 점검해 보는 게 좋아요.

더 알아보기

  • File.rename/2File.rename!/2의 차이(튜플 반환 vs 예외 발생)를 함께 확인해 보세요.
  • 파일 경로를 다루는 방법은 Path 모듈 문서에서 자세히 볼 수 있어요.
  • 오류 이유 타입의 의미는 File.posix/0 문서를 참고해요.