파일 접근은 명시적인 호스트 경계를 넘습니다. 단일 호출로 작업이 완료되면 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을 받습니다. 수명이 있는 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 하나로 읽기
내용이 ready인 note.txt를 만들고 다음 프로그램을 files-resources.tpz로 저장하세요.
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(오류)
}readyopen은 File을 생성하기 전에 실패할 수 있으므로 Result를 반환합니다. 후위 ? 연산자는 정리 작업이 등록되기 전에 발생한 오류를 전달합니다. 파일을 확보하는 데 성공하면 using 구문이 하위 범위에 불변 File 바인딩을 생성합니다. 또한 암묵적인 close 호출을 등록합니다. 범위가 닫히기 전에 읽기 결과를 외부의 가변 바인딩으로 이동시킵니다.
using과 defer 중 고르기
- 단일 블록이 정확히
File하나를 소유하는 경우using 파일 = open(경로)? { ... }사용을 권장합니다. 바인딩의 열린 수명은 하위 범위를 벗어나지 않습니다. - 소유 함수가 여러 중첩 블록에서
File을 사용해야 하는 경우let 파일 = open(경로)?바로 다음에defer { 파일.close() }를 등록합니다. using블록 내부에서 명시적으로파일.close()를 호출하더라도 등록된 닫기 작업은 취소되지 않습니다. 중복 닫기의 동작은 이식 가능한 계약이 아닙니다.
using과 defer는 정상 종료와 return, 후위 ?, break, continue를 통한 구조적 범위 이탈에서 리소스를 정리합니다. 실행 오류는 평가를 즉시 중단하며, 그 시점 이후의 어휘 범위 정리는 지정되어 있지 않습니다.
흔한 수정: file.write를 이어 쓰기로 설명하지 마세요. 이어 쓰기 모드, File의 바이너리 오버로드, 버퍼링, 권한, 줄 단위 File 메서드는 이식 가능한 계약 밖입니다. 파일 전체의 바이너리 데이터가 필요하면 FS 바이트 연산을 사용합니다.
기능과 값의 경계
File,FS,std.fs,std.io를 사용하는 경우 파일 시스템 접근을 제공하는 호스트 프로필이 필요합니다.- 모듈을 가져오더라도 경로, 환경 변수, 프로세스, 네트워크, 데이터베이스 권한은 생성되지 않습니다.
- 열기·읽기·쓰기 실패는
Result에 남으며, 포착할 수 있는 예외가 아닙니다. File은 불투명하며 비교할 수 없고, 명시된 시그니처 밖에서 닫힌 이후의 동작은 이식 가능하지 않습니다.- 사용자 정의 정리 프로토콜, 다중 리소스
using, 비동기·취소 정리, 모듈 수명 정리는 현재 언어 계약에 포함되지 않습니다.
Defer와 리소스, Null·Option·결과·fault, 표준 라이브러리 개요로 이어서 살펴보세요.