파일 접근은 명시적인 호스트 경계를 넘습니다. 단일 호출로 작업이 완료되면 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(경로: string) -> Result<File, string>
파일.read() -> Result<string, string>
파일.write(텍스트: 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()를 호출하더라도 등록된 닫기 작업은 취소되지 않습니다. 중복 닫기의 동작은 이식 가능한 계약이 아닙니다.
두 방식 모두 정상 종료 시 리소스를 정리합니다. 소유 범위를 벗어나는 return, ?, break, continue 제어 흐름에서도 정리가 수행됩니다. 그러나 범용 finally 보장은 아닙니다. 일반 실행 오류가 평가를 중단할 때 어휘 범위 정리가 실행되는 것은 언어 명세에서 보장하지 않습니다.
흔한 수정: file.write를 이어 쓰기로 설명하지 마세요. 이어 쓰기 모드, File의 바이너리 오버로드, 버퍼링, 권한, 줄 단위 File 메서드는 이식 가능한 계약 밖입니다. 파일 전체의 바이너리 데이터가 필요하면 FS 바이트 연산을 사용합니다.
기능과 값의 경계
File,FS,std.fs,std.io를 사용하는 경우 파일 시스템 접근을 제공하는 호스트 프로필이 필요합니다.- 모듈을 가져오더라도 경로, 환경 변수, 프로세스, 네트워크, 데이터베이스 권한은 생성되지 않습니다.
- 열기·읽기·쓰기 실패는
Result에 남으며, 포착할 수 있는 예외가 아닙니다. File은 불투명하며 비교할 수 없고, 명시된 시그니처 밖에서 닫힌 이후의 동작은 이식 가능하지 않습니다.- 사용자 정의 정리 프로토콜, 다중 리소스
using, 비동기·취소 정리, 모듈 수명 정리는 현재 언어 계약에 포함되지 않습니다.
Defer와 리소스, Null·Option·결과·fault, 표준 라이브러리 개요로 이어서 살펴보세요.