Path — 파일 시스템 경로 다루기

Path — 파일 시스템 경로 다루기

파일 경로를 문자열로 주물럭거리다 보면 플랫폼 간 차이에 부딪히기 마련이에요. Path 모듈은 그런 파일 시스템 경로를 다루거나 조회하는 편의 함수들을 모아 둔 모듈이에요. 경로 조립, 분해, 정규화 같은 일을 안전하게 처리해 주죠.

출처: Path

본문

이 모듈의 함수들은 chardata를 인자로 받을 수 있고, 항상 UTF-8로 인코딩된 문자열을 돌려줘요. chardata란 문자열이거나, 문자와 문자열의 리스트를 말해요. 자세한 건 IO.chardata/0을 참고하세요. binary가 전달되면, 어떤 인코딩이든 그 인코딩이 유지돼요.

이 모듈의 함수 대부분은 파일 시스템과 직접 상호작용하지 않아요. 단, wildcard/2expand/1처럼 파일 시스템이 필요한 일부 함수는 예외예요. 이 차이를 구분해 두면 "이 함수가 순수하게 문자열만 다루는구나"를 미리 알 수 있어서 좋아요.

경로를 다룰 때는 상대 경로와 절대 경로를 구분하는 일이 중요해요. Path.expand/1은 상대 경로를 현재 작업 디렉터리 기준 절대 경로로 바꿔 주고, Path.join/2는 여러 경로 조각을 이어 붙여요. Path.basename/1Path.dirname/1은 경로의 끝부분과 디렉터리 부분을 나눠 주죠.

예를 들어 "설정 파일의 이름만 떼어 내고 싶다"거나 "하위 디렉터리 경로를 합치고 싶다" 같은 상황이 잦아요. 이런 일은 문자열을 직접 자르기보다 Path 함수로 다루는 게 훨씬 안전해요. 구분자(/ vs \)나 상대·절대 여부까지 알아서 처리해 주니까요:

iex> Path.join("lib", "app.ex")
"lib/app.ex"
iex> Path.extname("config/app.exs")
".exs"
iex> Path.relative_to("/usr/lib/erl/lib", "/usr/lib")
"erl/lib"

경로를 플랫폼에 무관하게 다루고 싶을 때, 그냥 문자열 연산 대신 이 모듈의 함수를 쓰는 습관을 들이면 운영체제가 달라져도 코드는 그대로 동작해요.

더 알아보기

  • Path.join/2, Path.expand/1, Path.relative_to/2 — 경로 조립과 정규화
  • Path.basename/1, Path.dirname/1, Path.extname/1 — 경로 분해
  • Path.wildcard/2 — 파일 시스템에서 패턴에 맞는 파일 찾기
  • File — 실제 파일 읽기·쓰기
  • IO.chardata/0 — chardata의 정의