本文へ移動
Hikari リファレンス

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)!