파일 접근은 명시적인 호스트 경계를 넘습니다. 호출 한 번으로 작업이
끝나면 FS 연산을 고르세요. 여러 읽기나 쓰기가 하나의 열린 리소스를
공유해야 한다면 수명이 드러나는 File을 고릅니다.
FS와 File 중 고르기
| 하려는 일 | 사용할 기능 | 정확한 결과 |
|---|---|---|
| 텍스트 파일을 한 번에 읽기 | FS.readText(path) | Result<string, string> |
| 텍스트 파일을 한 번에 교체해 쓰기 | FS.writeText(path, text) | Result<(), string> |
| 불변 바이트를 읽거나 쓰기 | FS.readBytes, FS.writeBytes | Result<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 하나로 읽기
내용이 ready인 note.txt를 만들고 다음 프로그램을
files-resources.tpz로 저장하세요.
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)
}readyopen은 File을 만들기 전에 실패할 수 있으므로 Result를 반환합니다.
후위 ?는 정리가 등록되기 전에 그 오류를 전달합니다. 획득에 성공하면
using은 자식 범위에 불변 File 바인딩 하나를 만들고 암묵적인 close
하나를 등록합니다. 범위가 닫히기 전에 읽기 결과를 바깥의 가변
바인딩으로 옮깁니다.
using과 defer 중 고르기
- 한 블록이 정확히 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·결과·실행 오류, 표준 라이브러리 개요로 이어서 살펴보세요.