File.LinkError 예외

File.LinkError 예외

파일에 하드 링크(hard link)를 만드는 작업이 실패했을 때 발생하는 예외예요. 링크를 만들려는 대상 파일이 존재하지 않으면 이 예외가 떠요.

예를 들어 링크를 걸 원본 파일이 없는 상태에서 링크를 만들려고 하면 다음처럼 에러가 나요.

iex> File.ln!("existing.txt", "link.txt")
** (File.LinkError) could not create hard link from "link.txt" to "existing.txt": no such file or directory

출처: File.LinkError exception

본문

File.ln/2File.ln!/2하드 링크를 만드는 함수예요. 하드 링크는 같은 파일 데이터를 가리키는 또 하나의 이름을 만들어 주는 개념이에요. 이때 링크의 원본이 되는 파일이 실제로 존재해야 링크를 만들 수 있는데, 그 파일이 없으면 이 예외가 발생해요.

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

  • :existing (Path.t/0) — 링크를 걸 원본 파일 경로예요.
  • :new (Path.t/0) — 링크로 만들어질 목적지 경로예요.
  • :reason (File.posix/0) — 링크를 만들지 못한 이유예요.

필드를 보면 "원본 파일이 없어서 실패했는지", "목적지에 같은 이름이 이미 있어서 실패했는지" 같은 원인을 :reason 값으로 구분할 수 있어요. 에러를 처리할 때 이 값들을 조합하면 어떤 경로에서 어떤 문제가 생겼는지 로그로 정확히 남길 수 있죠.

하드 링크라는 개념이 처음이라면, 파일을 복사하는 것과 헷갈리기 쉬워요. 복사는 같은 내용을 가진 별도의 새로운 파일을 만드는 것이고, 하드 링크는 같은 데이터를 가리키는 이름을 하나 더 추가하는 것이에요. 그래서 하드 링크를 만들려면 원본 파일이 반드시 존재해야 하죠. 링크를 만들 대상(이름)이 이미 존재하면 그 이름은 덮어쓰지 못하고 오류가 나는 경우도 있어요. 이럴 때 File.rm/1로 기존 파일을 지운 뒤 다시 링크를 만드는 방식으로 처리하기도 해요.

실무에서는 설정 파일이나 바이너리를 배포할 때 특정 경로에 대한 링크를 만들어 주는 작업에서 이 예외를 만날 수 있어요. 그때는 :existing:new 필드의 경로가 실제로 존재하는지, 그리고 :reason이 뭔지를 함께 확인하면 원인을 빠르게 좁힐 수 있어요.

더 알아보기

  • 하드 링크와 심볼릭 링크의 차이가 궁금하다면 File.ln_s/2(심볼릭 링크) 문서를 함께 살펴보세요.
  • 링크 작업을 포함한 파일 관리 함수는 File 모듈 문서에서 확인할 수 있어요.
  • 오류 이유의 타입에 대한 설명은 File.posix/0 문서를 참고해요.