파일시스템
fs 모듈은 구성된 파일시스템 볼륨 내에서 파일을 읽고, 쓰고, 관리합니다.
이 페이지는 API 레퍼런스입니다. 예제는 구성된 볼륨과 그 볼륨을 획득할 권한을 전제로 합니다. 각 블록은 독립적인 작업 또는 부분 레시피입니다. config, message, process, report_cleanup_error와 같은 애플리케이션 값과 콜백은 이미 존재해야 합니다. report_cleanup_error(err)는 이미 발생한 작업 오류를 대체하지 않고 close 실패를 기록합니다.
파일시스템 설정은 파일시스템을 참조하세요.
로딩
local fs = require("fs")
볼륨 획득
레지스트리 ID로 파일시스템 볼륨을 획득합니다:
local vol, err = fs.get("app:storage")
if err then
return nil, err
end
local content, read_err = vol:readfile("/config.json")
if read_err then return nil, read_err end
return content
| 파라미터 | 타입 | 설명 |
|---|---|---|
name |
string | 볼륨 레지스트리 ID |
반환: FS, error
파일 읽기
전체 파일을 읽습니다:
local json = require("json")
local vol, get_err = fs.get("app:config")
if get_err then return nil, get_err end
local data, err = vol:readfile("/settings.json")
if err then
return nil, err
end
local config, decode_err = json.decode(data)
if decode_err then return nil, decode_err end
return config
open()으로 대용량 파일을 스트리밍합니다:
local errors = require("errors")
local file, err = vol:open("/data/large.csv", "r")
if err then
return nil, err
end
while true do
local chunk, err = file:read(65536)
if err then
if err:kind() == errors.NOT_FOUND then
break -- EOF
end
local _, close_err = file:close()
if close_err then report_cleanup_error(close_err) end
return nil, err
end
process(chunk)
end
local _, close_err = file:close()
if close_err then return nil, close_err end
파일 쓰기
문자열 또는 리더 기반 스트림을 파일에 씁니다:
local json = require("json")
local vol, get_err = fs.get("app:data")
if get_err then return nil, get_err end
-- Overwrite (default)
local encoded, encode_err = json.encode(config)
if encode_err then return nil, encode_err end
local _, write_err = vol:writefile("/config.json", encoded)
if write_err then return nil, write_err end
-- Append
local _, append_err = vol:writefile("/logs/app.log", message .. "\n", "a")
if append_err then return nil, append_err end
-- Exclusive write (fails if exists)
local ok, err = vol:writefile("/lock.pid", tostring(pid), "wx")
if err then return nil, err end
-- Copy from an open file or another reader-backed value
local source, err = vol:open("/incoming/report.csv", "r")
if err then
return nil, err
end
local copied, err = vol:writefile("/archive/report.csv", source)
local _, close_err = source:close()
if err then
if close_err then report_cleanup_error(close_err) end
return nil, err
end
if close_err then return nil, close_err end
return copied
| 모드 | 설명 |
|---|---|
"w" |
덮어쓰기 (기본값) |
"a" |
추가 |
"wx" |
배타적 쓰기 (파일이 존재하면 실패) |
스트리밍 쓰기에는 파일 핸들을 사용합니다:
local file, open_err = vol:open("/output/report.txt", "w")
if open_err then return nil, open_err end
local _, header_err = file:write("Header\n")
if header_err then
local _, close_err = file:close()
if close_err then report_cleanup_error(close_err) end
return nil, header_err
end
local _, data_err = file:write("Data: " .. value .. "\n")
if data_err then
local _, close_err = file:close()
if close_err then report_cleanup_error(close_err) end
return nil, data_err
end
local _, sync_err = file:sync()
if sync_err then
local _, close_err = file:close()
if close_err then report_cleanup_error(close_err) end
return nil, sync_err
end
local _, close_err = file:close()
if close_err then return nil, close_err end
경로 확인
local vol, get_err = fs.get("app:data")
if get_err then return nil, get_err end
-- Check existence
local exists, exists_err = vol:exists("/cache/results.json")
if exists_err then return nil, exists_err end
if exists then
return vol:readfile("/cache/results.json")
end
-- Check if directory
local is_dir, isdir_err = vol:isdir(path)
if isdir_err then return nil, isdir_err end
if is_dir then
process_directory(path)
end
-- Get file info
local info, stat_err = vol:stat("/documents/report.pdf")
if stat_err then return nil, stat_err end
print(info.size, info.modified, info.type)
Stat 필드: name, size, mode, modified, is_dir, type
디렉터리 작업
local vol, get_err = fs.get("app:data")
if get_err then return nil, get_err end
-- Create directory
local _, mkdir_err = vol:mkdir("/uploads/" .. user_id)
if mkdir_err then return nil, mkdir_err end
-- List directory contents
local iter, state = vol:readdir("/documents")
if not iter then return nil, state end
for entry in iter, state do
print(entry.name, entry.type)
end
-- Remove file or empty directory
local removed, remove_err = vol:remove("/temp/file.txt")
if remove_err then return nil, remove_err end
return removed
항목 필드: name, type ("file" 또는 "directory")
mkdir는 하나의 디렉터리만 만들며 누락된 상위 디렉터리는 만들지 않습니다. remove는 파일과 빈 디렉터리만 처리합니다.
파일 핸들 메서드
스트리밍용 vol:open() 사용 시:
| 메서드 | 설명 |
|---|---|
read(size?) |
바이트 읽기 (기본값: 4096) |
write(data) |
문자열 데이터 쓰기 |
seek(whence, offset) |
위치 설정 ("set", "cur", "end") |
stat() |
파일 정보 가져오기 (vol:stat과 동일한 필드) |
sync() |
스토리지로 플러시 |
close() |
파일 핸들 해제 |
scanner(split?) |
라인/워드 스캐너 생성 |
파일 핸들 사용이 끝나면 close()를 호출하세요.
스캐너
줄 단위 처리에는 스캐너를 사용합니다:
local file, err = vol:open("/data/users.csv", "r")
if err then
return nil, err
end
local scanner, err = file:scanner("lines")
if err then
local _, close_err = file:close()
if close_err then report_cleanup_error(close_err) end
return nil, err
end
scanner:scan() -- skip header
while scanner:scan() do
local line = scanner:text()
process(line)
end
local scan_err = scanner:err()
if scan_err then
local _, close_err = file:close()
if close_err then report_cleanup_error(close_err) end
return nil, scan_err
end
local _, close_err = file:close()
if close_err then return nil, close_err end
분할 모드: "lines" (기본값), "words", "bytes", "runes"
scanner:scan()은 불리언만 반환합니다. false를 반환하면 scanner:err()를 호출해 정상 EOF와 토큰화 또는 하위 읽기 실패를 구분하세요. scanner:err()는 구조화된 INTERNAL 오류 또는 nil을 반환합니다. 스트림 스캐너와 달리 파일 스캐너에는 별도의 스캔 디스패치 오류 반환이 없습니다.
상수
fs.type.FILE -- "file"
fs.type.DIR -- "directory"
fs.seek.SET -- from start
fs.seek.CUR -- from current
fs.seek.END -- from end
FS 메서드
| 메서드 | 반환 | 설명 |
|---|---|---|
readfile(path) / read_file(path) |
string, error |
전체 파일 읽기 |
writefile(path, data, mode?) / write_file(path, data, mode?) |
boolean, error |
문자열 또는 리더 기반 값 쓰기 |
exists(path) |
boolean, error |
경로 존재 확인 |
stat(path) |
table, error |
파일 정보 가져오기 |
isdir(path) |
boolean, error |
디렉토리인지 확인 |
mkdir(path) |
boolean, error |
디렉토리 생성 |
remove(path) |
boolean, error |
파일/빈 디렉토리 제거 |
readdir(path) |
iterator, state |
디렉토리 목록 (제네릭 for 루프에서 사용) |
open(path, mode) |
File, error |
파일 핸들 열기 |
chdir(path) |
boolean, error |
작업 디렉토리 변경 |
pwd() |
string, error |
작업 디렉토리 가져오기 |
권한
볼륨을 획득할 때 보안 정책 평가가 적용됩니다.
| 액션 | 리소스 | 설명 |
|---|---|---|
fs.get |
볼륨 ID | 파일시스템 볼륨 획득 |
에러
| 조건 | 종류 | 재시도 가능 |
|---|---|---|
| 빈 경로 | errors.INVALID |
unspecified |
| 경로에 null 바이트 포함 | errors.INVALID |
아니요 |
| 잘못된 모드 | errors.INVALID |
unspecified |
닫힌 파일에서 scanner() 호출 |
errors.INVALID |
unspecified |
| 닫힌 파일에서 read, write, seek, stat 또는 sync 호출 | errors.INTERNAL |
아니요 |
이미 닫힌 파일에서 close() 호출 |
성공 | 해당 없음 |
| 파일 핸들 읽기가 EOF에 도달 | errors.NOT_FOUND |
unspecified |
| 경로를 찾을 수 없음 | errors.NOT_FOUND |
가능한 경우 하위 오류의 값 유지 |
| 경로가 이미 존재 | errors.ALREADY_EXISTS |
unspecified |
| 권한 거부 | errors.PERMISSION_DENIED |
아니요 |
| 파일 스캐너 토큰화 또는 읽기 실패 | errors.INTERNAL |
가능한 경우 하위 오류의 값 유지 |
unspecified는 err:retryable()이 nil을 반환한다는 뜻이며, false와 같지 않습니다.
오류 처리는 오류 처리를 참조하세요.