표준 라이브러리와 런타임

파일과 리소스

단발성 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을 받습니다. 수명이 있는 API 표면은 의도적으로 작게 유지했습니다.

open(path: string) -> Result<File, string>
파일.read() -> Result<string, string>
파일.write(s: string) -> Result<(), string>
파일.close() -> ()

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

관리되는 File 하나로 읽기

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

TOPAZ
function 메모읽기(경로: string) -> Result<string, string> {
    let mut 결과: Result<string, string> = Err("not read")
    using 파일 = open(경로)? {
        결과 = 파일.read()
    }
    return 결과
}

match 메모읽기("note.txt") {
    case Ok(텍스트) => print(텍스트.trim())
    case Err(오류) => print(오류)
}
출력
ready

openFile을 생성하기 전에 실패할 수 있으므로 Result를 반환합니다. 후위 ? 연산자는 정리 작업이 등록되기 전에 발생한 오류를 전달합니다. 파일을 확보하는 데 성공하면 using 구문이 하위 범위에 불변 File 바인딩을 생성합니다. 또한 암묵적인 close 호출을 등록합니다. 범위가 닫히기 전에 읽기 결과를 외부의 가변 바인딩으로 이동시킵니다.

usingdefer 중 고르기

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

usingdefer는 정상 종료와 return, 후위 ?, break, continue를 통한 구조적 범위 이탈에서 리소스를 정리합니다. 실행 오류는 평가를 즉시 중단하며, 그 시점 이후의 어휘 범위 정리는 지정되어 있지 않습니다.

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

기능과 값의 경계

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

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