Tempfile

Tempfile (임시 파일)

Tempfile임시 파일을 만들고 관리하는 클래스예요. 고유한 이름의 파일을 시스템 임시 디렉토리에 생성하고, 사용이 끝나면 삭제할 수 있게 도와줘요. tempfile 라이브러리를 require 해서 사용해요.

출처: Ruby 3.3 API

본문

TempfileFile의 기능을 위임(delegation)받는 DelegateClass(File) 방식이라, File의 많은 메서드를 그대로 쓸 수 있어요.

Tempfile.create(basename="", tmpdir=nil, mode: 0, **options) { |tmpfile| ... }

기본 파일 시스템에 파일을 만들고, 그 파일을 바탕으로 한 File 객체를 돌려줘요.

  • 인자 없이 블록 없이 호출하면 다음 성질을 가진 파일을 만들어 돌려줘요.
    • 클래스는 File이에요 (Tempfile이 아니라).
    • 디렉토리는 시스템 임시 디렉토리예요 (시스템 의존적).
    • 생성된 파일 이름은 그 디렉토리 안에서 고유(unique)해요.
    • 권한(permissions)은 0600이에요.
    • 모드는 'w+' (읽기/쓰기, 파일 끝 위치)예요.
  • 블록 없이 호출하면 파일이 자동으로 삭제되지 않으므로 직접 삭제해야 해요.
f = Tempfile.create          # => #<File:/tmp/...>
f.class                      # => File
f.path                       # => "/tmp/20220505-9795-17ky6f6"
f.stat.mode.to_s(8)          # => "100600"

블록을 주면 파일은 블록이 끝날 때 닫히고 삭제돼요.

Tempfile.new(basename="", tmpdir=nil, mode: 0, **options)

기본 파일 시스템에 파일을 만들고, 그 파일을 바탕으로 한 Tempfile 객체를 돌려줘요. 가능하면 대신 Tempfile.create 사용을 고려해 보세요.

  • Tempfile.createTempfile.newDelegateClass(File)을 부를 때 발생하는 위임(delegation) 성능 비용을 피해요.
  • 파이널라이저(finalizer)에 의존해 파일을 닫고 지우지 않아요 (파이널라이저는 비신뢰적일 수 있어요).

만들어지는 파일의 성질은 create와 비슷하지만, 클래스가 Tempfile이라는 점(그리고 Tempfile.create처럼 File이 아니라는 점)이 달라요.

Tempfile.open(*args, **kw) { |tempfile| ... }

Tempfile을 만들어요. 이 메서드는 권장되지 않고, 주로 하위 호환성을 위해 존재해요. Tempfile.create를 사용하세요. block이 없으면 Tempfile.new와 동의어예요. block이 주어지면 Tempfile 객체가 만들어져 그 객체를 인자로 block이 실행되고, block이 끝나면 Tempfile 객체는 자동으로 닫혀요.

close(unlink_now=false)

파일을 닫아요. unlink_nowtrue면 닫은 뒤 파일을 언링크(삭제)해요. 지금 지우지 않으면 나중에 unlink를 호출할 수도 있어요. 임시 파일을 명시적으로 지우지 않으면, 제거는 객체가 파이널라이즈될 때까지 지연돼요.

close!()

파일을 닫고 지워요(삭제). close(true)를 호출한 것과 같은 효과예요.

open()

파일을 "r+" 모드로 열거나 다시 열어요.

path()

임시 파일의 전체 경로 이름을 돌려줘요. unlink가 호출된 뒤에는 nil이 돼요.

size()

임시 파일의 크기를 돌려줘요. 부수 효과로, 크기를 정하기 전에 IO 버퍼가 플러시돼요. lengthsize의 별칭이에요.

파일을 파일 시스템에서 지워요. deleteunlink의 별칭이에요. 파일을 사용한 뒤에는 항상 unlink하는 게 좋아요.

file = Tempfile.new('foo')
begin
  # ...do something with file...
ensure
  file.close
  file.unlink   # deletes the temp file
end

닫기 전에 unlink — POSIX 시스템에서는 파일을 닫기 전에 지우는 게 가능해요. 다만 비-POSIX 운영체제(가장 대표적으로 Microsoft Windows)에서는 지원되지 않을 수 있어요. Windows에서는 닫히지 않은 파일을 지우지 못할 수 있어요.

initialize_dup / initialize_clone / initialize_copy_iv는 복제·복사 시 내부 상태를 올바르게 옮기기 위한 내부 메서드예요.