File.Stat

File.Stat

파일에 대한 정보를 담고 있는 struct예요. Erlang에서는 이 struct가 :file_info 레코드로 표현되기 때문에, 이 모듈은 Erlang 레코드와 Elixir struct 사이를 변환하는 함수도 함께 제공해요.

출처: File.Stat

본문

File.stat/2 같은 함수로 파일 정보를 조회하면 이 struct를 얻게 돼요. 필드를 하나씩 살펴보면 파일이 어떤 모습인지 상세히 알 수 있어요.

  • size — 파일의 크기(바이트 단위)예요.
  • type — 파일의 종류예요. :device, :directory, :regular, :other, :symlink 중 하나예요.
  • access — 현재 시스템이 파일에 접근할 수 있는 권한이에요. :read, :write, :read_write, :none 중 하나예요.
  • atime — 파일을 마지막으로 읽은 시간이에요.
  • mtime — 파일을 마지막으로 쓴 시간이에요.
  • ctime — 이 시간 필드의 해석은 운영체제에 따라 달라져요. Unix 계열에서는 파일이나 inode를 마지막으로 변경한 시간이고, Windows에서는 파일을 생성한 시간이에요.
  • mode — 파일 권한이에요.
  • links — 이 파일을 가리키는 링크의 개수예요. 링크 개념이 없는 파일 시스템에서는 항상 1이에요.
  • major_device — 파일이 있는 파일 시스템을 식별해요. Windows에서는 숫자가 드라이브를 뜻해요. 0은 A:, 1은 B:를 의미하죠.
  • minor_device — Unix 계열 시스템의 문자 장치(character device)에서만 유효해요. 그 외의 경우에는 0이에요.
  • inode — inode 번호를 알려줘요. Unix 계열이 아닌 파일 시스템에서는 0이에요.
  • uid — 파일의 소유자를 나타내요. Unix 계열이 아닌 파일 시스템에서는 0이에요.
  • gid — 파일을 소유한 그룹을 나타내요. Unix 계열이 아닌 파일 시스템에서는 0이에요.

atime, mtime, ctime에 담기는 시간 타입은 옵션에서 설정한 시간 타입에 따라 달라져요. {:time, type} 형태로 주는데, type:local, :universal, :posix 중 하나이고 기본값은 :universal이에요.

주요 타입

t/0 타입은 위 필드들을 모두 담고 있어요. 특히 시간 필드는 :calendar.datetime/0이거나 정수이거나 :undefined일 수 있는 걸 볼 수 있어요.

@type t() :: %File.Stat{
  access: :read | :write | :read_write | :none | :undefined,
  atime: :calendar.datetime() | integer() | :undefined,
  ctime: :calendar.datetime() | integer() | :undefined,
  gid: non_neg_integer() | :undefined,
  inode: non_neg_integer() | :undefined,
  links: non_neg_integer() | :undefined,
  major_device: non_neg_integer() | :undefined,
  minor_device: non_neg_integer() | :undefined,
  mode: non_neg_integer() | :undefined,
  mtime: :calendar.datetime() | integer() | :undefined,
  size: non_neg_integer() | :undefined,
  type: :device | :directory | :regular | :other | :symlink | :undefined,
  uid: non_neg_integer() | :undefined
}

변환 함수

이 모듈은 Erlang 레코드와의 변환을 돕는 두 함수를 제공해요.

  • from_record(file_info):file_info 레코드를 File.Stat struct로 변환해요.
@spec from_record(:file.file_info()) :: t()
  • to_record(stat)File.Stat struct를 :file_info 레코드로 변환해요.
@spec to_record(t()) :: :file.file_info()

Erlang의 :file 모듈과 함께 작업할 때 이 변환 함수들이 경계를 매끄럽게 이어줘요.

더 알아보기

  • 파일 정보를 얻는 File.stat/2 함수와 함께 살펴보면 활용 흐름이 분명해져요.
  • Erlang 쪽 표현인 :file_info 레코드는 :file 모듈 문서에서 확인할 수 있어요.
  • 시간 옵션({:time, type})의 자세한 동작은 File.stat/2 문서를 참고해 보세요.