표준 라이브러리와 런타임

파일과 리소스

한 번의 FS 연산과 수명이 있는 File 중 알맞은 방식을 고르고 Result와 정리 시점을 정확히 다룹니다.

파일 접근은 명시적인 호스트 경계를 넘습니다. 호출 한 번으로 작업이 끝나면 FS 연산을 고르세요. 여러 읽기나 쓰기가 하나의 열린 리소스를 공유해야 한다면 수명이 드러나는 File을 고릅니다.

FSFile 중 고르기

하려는 일사용할 기능정확한 결과
텍스트 파일을 한 번에 읽기FS.readText(path)Result<string, string>
텍스트 파일을 한 번에 교체해 쓰기FS.writeText(path, text)Result<(), string>
불변 바이트를 읽거나 쓰기FS.readBytes, FS.writeBytesResult<Bytes, string> 또는 Result<(), string>
디렉터리 하나의 항목 나열FS.list(path)Result<Array<{ kind: string, name: string, sizeBytes: Option<int> }>, string>
여러 작업 동안 파일 하나를 열어 두기open(path)Result<File, string>

FS 호출은 Path | string을 받습니다. 수명이 있는 표면은 의도적으로 더 작습니다.

open(path: string) -> Result<File, string>
file.read() -> Result<string, string>
file.write(text: string) -> Result<(), string>
file.close() -> ()

정식 API에는 File.open, File.create, File.append, readLine, writeLine, flush가 없습니다.

관리되는 File 하나로 읽기

내용이 readynote.txt를 만들고 다음 프로그램을 files-resources.tpz로 저장하세요.

TOPAZ
function readNote(path: string) -> Result<string, string> {
    let mut result: Result<string, string> = Err("not read")
    using file = open(path)? {
        result = file.read()
    }
    return result
}

match readNote("note.txt") {
    case Ok(text) => print(text.trim())
    case Err(error) => print(error)
}
출력
ready

openFile을 만들기 전에 실패할 수 있으므로 Result를 반환합니다. 후위 ?는 정리가 등록되기 전에 그 오류를 전달합니다. 획득에 성공하면 using은 자식 범위에 불변 File 바인딩 하나를 만들고 암묵적인 close 하나를 등록합니다. 범위가 닫히기 전에 읽기 결과를 바깥의 가변 바인딩으로 옮깁니다.

usingdefer 중 고르기

  • 한 블록이 정확히 File 하나를 소유한다면 using file = open(path)? { ... }을 권장합니다. 바인딩의 열린 수명은 자식 범위를 벗어나지 않습니다.
  • 소유 함수가 여러 중첩 블록에서 File을 써야 한다면 let file = open(path)? 바로 다음에 defer { file.close() }를 등록합니다.
  • using 안에서 명시적으로 file.close()를 호출해도 등록된 닫기는 취소되지 않습니다. 반복 닫기의 동작은 이식 가능한 계약이 아닙니다.

두 방식은 정상 종료와 소유 범위를 가로지르는 return, ?, break, continue에서 정리합니다. 그러나 범용 finally 보장은 아닙니다. 일반 실행 오류가 평가를 중단하면 어휘 범위 정리가 실행된다고 언어가 보장하지 않습니다.

흔한 수정: file.write를 이어 쓰기라고 설명하지 마세요. 이어 쓰기 모드, File의 바이너리 오버로드, 버퍼링, 권한, 줄 단위 File 메서드는 이식 가능한 계약 밖입니다. 파일 전체의 바이너리 자료가 필요하면 정확한 FS 바이트 연산을 사용합니다.

기능과 값의 경계

  • File, FS, std.fs, std.io에는 파일 시스템 접근을 제공하는 호스트 프로필이 필요합니다.
  • 모듈을 가져온다고 경로, 환경 변수, 프로세스, 네트워크, 데이터베이스 권한이 생기지 않습니다.
  • 열기·읽기·쓰기 실패는 Result에 남으며 잡을 수 있는 예외가 아닙니다.
  • File은 불투명하고 비교할 수 없으며, 나열된 시그니처 밖의 닫힌 후 동작은 이식 가능하지 않습니다.
  • 사용자 정의 정리 프로토콜, 여러 리소스 using, 비동기·취소 정리, 모듈 수명 정리는 현재 언어 계약이 아닙니다.

Defer와 리소스, Null·Option·결과·실행 오류, 표준 라이브러리 개요로 이어서 살펴보세요.