std:fs リファレンス
import fs := "std:fs" で取得するファイルシステムモジュール。ファイルの読み書き・ディレクトリ操作・存在確認などの非同期 I/O を提供する。
File
ExactlyOnce(File)
ファイルハンドル。ExactlyOnce の多重度型で、close が Consuming メソッドである。
閉じ忘れは記述子の漏れなので消費義務を課す — 未消費のまま有効範囲を出ると
never-consumed の診断になる。read_at / write_at / size / sync は受け手を借用する。
>>> import fs := "std:fs" >>> f := fs.open("notes.txt")!.unwrap! >>> f.close()!
exists
exists(path)
exists: { String | Effect(Future(Result(Bool)), Fs) }
path の存在を確かめる (不在は Ok(false))。
効果ハンドラーの操作である。handle の操作スロットに exists と書いて横取りできる(language-spec.md §17.9)。
>>> print fs.exists("README.md")!
mkdir
mkdir(path)
mkdir: { String | Effect(Future(Result(Unit)), Fs) }
path を親ごと再帰作成する (冪等)。
効果ハンドラーの操作である。handle の操作スロットに mkdir と書いて横取りできる(language-spec.md §17.9)。
>>> fs.mkdir("build/tmp")!
mkdtemp
mkdtemp(prefix)
mkdtemp: { String | Effect(Future(Result(String)), Fs) }
ホストの一時ディレクトリ直下に prefix で始まる一意な dir を作り、その完全パスを
返す。unix では 0700 で作る。自動では消えないので、後始末は remove_all で行う。
prefix にパス区切りは入れられない。
効果ハンドラーの操作である。handle の操作スロットに mkdtemp と書いて横取りできる(language-spec.md §17.9)。
>>> dir := fs.mkdtemp("hikari-build-")!.unwrap!
open
open(path)
open: { String | Effect(Future(Result(File)), Fs) }
読み取り専用でファイルを開き File ハンドルを得る (不在は Err)。
効果ハンドラーの操作である。handle の操作スロットに open と書いて横取りできる(language-spec.md §17.9)。
>>> f := fs.open("notes.txt")! >>> print f.size()!
open_rw
open_rw(path)
open_rw: { String | Effect(Future(Result(File)), Fs) }
読み書きでファイルを開き File ハンドルを得る (不在なら作成)。
効果ハンドラーの操作である。handle の操作スロットに open_rw と書いて横取りできる(language-spec.md §17.9)。
>>> f := fs.open_rw("log.txt")! >>> f.close()!
read
read(path)
read: { String | Effect(Future(Result(String)), Fs) }
path のファイルを UTF-8 テキストとして読む。
効果ハンドラーの操作である。handle の操作スロットに read と書いて横取りできる(language-spec.md §17.9)。
>>> text := fs.read("notes.txt")! >>> print text
read_bytes
read_bytes(path)
read_bytes: { String | Effect(Future(Result(Bytes)), Fs) }
path のファイルを Bytes として読む (デコードなし)。
効果ハンドラーの操作である。handle の操作スロットに read_bytes と書いて横取りできる(language-spec.md §17.9)。
>>> data := fs.read_bytes("image.png")! >>> print data.length!
readdir
readdir(path)
readdir: { String | Effect(Future(Result(List({ name: String, is_dir: Bool |}))), Fs) }
path 直下のエントリ ({name, is_dir} の List) を読む。
効果ハンドラーの操作である。handle の操作スロットに readdir と書いて横取りできる(language-spec.md §17.9)。
>>> entries := fs.readdir(".")! >>> print entries
remove
remove(path)
remove: { String | Effect(Future(Result(Unit)), Fs) }
path (ファイル or 空ディレクトリ) を 1 つ削除する。
効果ハンドラーの操作である。handle の操作スロットに remove と書いて横取りできる(language-spec.md §17.9)。
>>> fs.remove("build/tmp")!
remove_all
remove_all(path)
remove_all: { String | Effect(Future(Result(Unit)), Fs) }
path を中身ごと再帰削除する (rm -rf 相当)。不在でも Ok を返す (冪等)。
シンボリックリンクは辿らず、リンク自身を消す。
効果ハンドラーの操作である。handle の操作スロットに remove_all と書いて横取りできる(language-spec.md §17.9)。
>>> fs.remove_all("build/stage")!
rename
rename(old, new)
rename: { String, String | Effect(Future(Result(Unit)), Fs) }
old を new へ改名・移動する。
効果ハンドラーの操作である。handle の操作スロットに rename と書いて横取りできる(language-spec.md §17.9)。
>>> fs.rename("draft.txt", "final.txt")!
stat
stat(path)
stat: { String | Effect(Future(Result({ size: Int, mtime: Int, is_dir: Bool |})), Fs) }
path のメタ情報 ({size, mtime, is_dir}) を読む。
効果ハンドラーの操作である。handle の操作スロットに stat と書いて横取りできる(language-spec.md §17.9)。
>>> info := fs.stat("README.md")! >>> print info
walk
walk(path)
walk: { String | Effect(Future(Result(List(String))), Fs) }
path 配下の通常ファイルのパスを再帰的に集める (パス昇順)。ディレクトリ自身は
含めない。path がファイルなら [path] を返す。
効果ハンドラーの操作である。handle の操作スロットに walk と書いて横取りできる(language-spec.md §17.9)。
>>> files := fs.walk("docs")! >>> print files
write
write(path, content)
write: { String, String | Effect(Future(Result(Unit)), Fs) }
path に content を UTF-8 テキストとして書く (上書き)。
効果ハンドラーの操作である。handle の操作スロットに write と書いて横取りできる(language-spec.md §17.9)。
>>> fs.write("greeting.txt", "hello")!
write_bytes
write_bytes(path, content)
write_bytes: { String, Bytes | Effect(Future(Result(Unit)), Fs) }
path に Bytes content をそのまま書く (上書き)。
効果ハンドラーの操作である。handle の操作スロットに write_bytes と書いて横取りできる(language-spec.md §17.9)。
>>> data := fs.read_bytes("a.bin")! >>> fs.write_bytes("b.bin", data)!
File メソッド
close
f.close() close: Consuming({ Effect(Future(Result(Unit)), Fs) })
閉じて封印する。以降のメソッド呼び出しは Error。
効果ハンドラーの操作である。handle の操作スロットに close と書いて横取りできる(language-spec.md §17.9)。
>>> f := fs.open("data.bin")! >>> f.close()!
read_at
f.read_at(offset, n) read_at: { Int, Int | Effect(Future(Result(Bytes)), Fs) }
オフセットから最大 n bytes 読む。EOF 越えは短い Bytes。
効果ハンドラーの操作である。handle の操作スロットに read_at と書いて横取りできる(language-spec.md §17.9)。
>>> f := fs.open("data.bin")! >>> chunk := f.read_at(0, 16)! >>> print chunk
size
f.size() size: { Effect(Future(Result(Int)), Fs) }
現在のファイルサイズ (bytes)。
効果ハンドラーの操作である。handle の操作スロットに size と書いて横取りできる(language-spec.md §17.9)。
>>> f := fs.open("data.bin")! >>> print f.size()!
sync
f.sync() sync: { Effect(Future(Result(Unit)), Fs) }
OS バッファーをディスクへ確定する (fsync)。
効果ハンドラーの操作である。handle の操作スロットに sync と書いて横取りできる(language-spec.md §17.9)。
>>> f := fs.open_rw("log.txt")! >>> f.sync()!
truncate
f.truncate(n) truncate: { Int | Effect(Future(Result(Unit)), Fs) }
サイズを n bytes に切り詰め / 拡張する。
効果ハンドラーの操作である。handle の操作スロットに truncate と書いて横取りできる(language-spec.md §17.9)。
>>> f := fs.open_rw("log.txt")! >>> f.truncate(0)!
write_at
f.write_at(offset, bytes) write_at: { Int, Bytes | Effect(Future(Result(Unit)), Fs) }
オフセットに bytes を全量書く。末尾を越える位置はファイルを拡張する。
効果ハンドラーの操作である。handle の操作スロットに write_at と書いて横取りできる(language-spec.md §17.9)。
>>> f := fs.open_rw("data.bin")! >>> data := fs.read_bytes("src.bin")! >>> f.write_at(0, data)!