filesystem

std.filesystem

def File

pub def File: i32

一个打开的文件,由其文件描述符标识

def Kind

pub def Kind: u8

路径所指向的目标类型

val KIND_OTHER

pub val KIND_OTHER:   Kind = 0

val KIND_FILE

pub val KIND_FILE:    Kind = 1

val KIND_DIR

pub val KIND_DIR:     Kind = 2
pub val KIND_SYMLINK: Kind = 3

rec Metadata

pub rec Metadata;

可移植的文件元数据

kind:文件、目录、符号链接或其他 size:字节大小 mode:原始权限/类型位(POSIX;在其他地方合成) modified:最后修改时间 accessed:最后访问时间 created:平台提供时的创建时间,否则为无(none)

val STDIN

pub val STDIN:  File = 0

标准流,作为已打开的文件

val STDOUT

pub val STDOUT: File = 1

val STDERR

pub val STDERR: File = 2

fun open

pub fun open(p: Path) R.Result[File, str];

打开一个文件用于读取

p:文件路径 ret:打开的文件,或一个错误

fun create

pub fun create(p: Path, mode: i32) R.Result[File, str];

创建或截断一个文件用于写入

p:文件路径 mode:新创建文件的权限位 ret:打开的文件,或一个错误

fun close

pub fun close(f: File) O.Option[str];

关闭一个打开的文件

f:要关闭的文件 ret:成功时为 none,或一个错误

fun sync

pub fun sync(f: File) O.Option[str];

将打开的文件的数据和元数据刷新到其后备存储(backing storage)

f:要刷新的文件 ret:成功时为 none,或一个错误

fun read

pub fun read(f: File, buf: *u8, len: usize) R.Result[usize, str];

最多读取 len 字节到 buf

f:要读取的文件 buf:目标缓冲区 len:最大读取字节数 ret:已读取的字节数(文件末尾为 0),或一个错误

fun write

pub fun write(f: File, buf: *u8, len: usize) R.Result[usize, str];

buf 中写入最多 len 字节

f:要写入的文件 buf:源缓冲区 len:要写入的字节数 ret:已写入的字节数,或一个错误

fun seek

pub fun seek(f: File, offset: i64, whence: i32) R.Result[i64, str];

重新定位文件偏移量

f:要进行 seek 的文件 offset:相对于 whence 的字节偏移量 whenceSEEK_SETSEEK_CURSEEK_END ret:生成的绝对偏移量,或一个错误

fun reader

pub fun reader(f: File) m_reader.Reader;

将文件适配为 io.Reader(该文件的生命周期必须长于 reader)

f:要读取的文件 ret:从 f 提取数据的 Reader

fun writer

pub fun writer(f: File) m_writer.Writer;

将文件适配为 io.Writer(该文件的生命周期必须长于 writer)

f:要写入的文件 ret:向 f 写入数据的 Writer

fun read_bytes

pub fun read_bytes(a: *A.Allocator, p: Path) R.Result[Vector[u8], str];

将整个文件读取到已分配的字节缓冲区中

在文件的 Reader 之上组合了 io.read_all:随读随增长,因此不需要大小假设。调用者拥有返回的向量。

a:结果的分配器 p:文件路径 ret:文件内容,或一个错误

fun read_string

pub fun read_string(a: *A.Allocator, p: Path) R.Result[str, str];

将整个文件读取到已分配的、以空字符结尾的字符串中

获取文件的大小信息,并将 io.read_exact 组合到精确大小的缓冲区中,仅分配一次且无需增长。适用于文本;当通过 str_len 读取时,包含嵌入式 NUL 字节的二进制内容会将其长度截断到第一个 NUL 处。

a:结果的分配器 p:文件路径 ret:文件内容,或一个错误

fun write_bytes

pub fun write_bytes(p: Path, data: *u8, len: usize, mode: i32) O.Option[str];

将字节写入文件,创建或截断文件

在文件的 Writer 之上组合了 io.write_all

p:文件路径 data:要写入的字节 len:字节数 mode:新创建文件的权限位 ret:成功时为 none,或一个错误

fun replace_bytes_atomic

pub fun replace_bytes_atomic(a: *A.Allocator, p: Path, data: *u8, len: usize, file_mode: i32, dir_mode: i32) O.Option[str];

通过持久的同级临时文件原子性地替换文件

在创建临时文件之前会创建缺失的父目录。临时文件在目标文件旁边以 O_EXCL 创建、刷新并在重命名之前关闭,因此读者要么看到旧文件,要么看到完整的替换文件,且不会发生跨设备重命名。重命名后,POSIX 还会刷新父目录,以便新的命名空间条目在崩溃时得以保存。如果最后的刷新失败,即使此函数报告了持久性失败,替换文件也已经可见。

a:临时路径的分配器 p:目标路径 data:要写入的字节 len:字节数 file_mode:替换文件的权限位 dir_mode:新创建父目录的权限位 ret:成功时为 none,或一个错误

fun stat_of

pub fun stat_of(f: File) R.Result[Metadata, str];

打开文件的元数据

f:要查询的文件 ret:元数据,或一个错误

fun metadata

pub fun metadata(p: Path) R.Result[Metadata, str];

路径的元数据,会跟随最后的符号链接

p:要查询的路径 ret:元数据,或一个错误

pub fun metadata_link(p: Path) R.Result[Metadata, str];

路径的元数据,不跟随最后的符号链接

p:要查询的路径 ret:元数据(符号链接会报告其自身),或一个错误

fun meta_is_dir

pub fun meta_is_dir(m: *Metadata) bool;

检查元数据是否描述了一个目录

fun meta_is_file

pub fun meta_is_file(m: *Metadata) bool;

检查元数据是否描述了一个常规文件

pub fun meta_is_symlink(m: *Metadata) bool;

检查元数据是否描述了一个符号链接

fun exists

pub fun exists(p: Path) bool;

检查路径是否存在(作为任何条目,包括断开的符号链接)

fun is_file

pub fun is_file(p: Path) bool;

检查路径是否为现有的常规文件(会跟随符号链接)

fun is_dir

pub fun is_dir(p: Path) bool;

检查路径是否为现有的目录(会跟随符号链接)

pub fun is_symlink(p: Path) bool;

检查路径是否为符号链接(不跟随它)

fun create_dir

pub fun create_dir(p: Path, mode: i32) O.Option[str];

创建一个单层目录

p:目录路径 mode:权限位 ret:成功时为 none,或一个错误

fun remove_file

pub fun remove_file(p: Path) O.Option[str];

删除单个文件或符号链接

p:要删除的路径 ret:成功时为 none,或一个错误

fun remove_dir

pub fun remove_dir(p: Path) O.Option[str];

删除一个空目录

p:要删除的目录路径 ret:成功时为 none,或一个错误

fun rename

pub fun rename(from: Path, to: Path) O.Option[str];

重命名或移动文件或目录

现有的目标文件将被替换,正如 POSIX rename 所做的那样。替换现有的目录并不是可移植的:POSIX 允许当目标为空目录时这样做,而 Windows 直接拒绝,因此调用者不应该依赖它。

from:源路径 to:目标路径 ret:成功时为 none,或一个错误

pub fun symlink(target: Path, linkpath: Path) O.Option[str];

linkpath 处创建一个指向 target 的符号链接

target:链接指向的路径(按原样存储) linkpath:要创建的链接路径 ret:成功时为 none,或一个错误

fun read_dir

pub fun read_dir(a: *A.Allocator, p: Path) R.Result[Vector[str], str];

列出目录中的条目,排除 ...

每个名称都是由调用者的分配器拥有的、新分配的字符串;返回的向量拥有它们,并通过 vector.dnit(或由 arena 整体释放)来释放。按目录顺序列出名称。

a:向量及每个名称的分配器 p:目录路径 ret:子项名称,或一个错误

fun create_dir_all

pub fun create_dir_all(a: *A.Allocator, p: Path, mode: i32) O.Option[str];

创建一个目录以及所有缺失的父目录(类似 mkdir -p

a:临时父路径的分配器 p:目录路径 mode:所创建目录的权限位 ret:成功时为 none,或一个错误

fun remove_all

pub fun remove_all(a: *A.Allocator, p: Path) O.Option[str];

递归删除文件、目录树或符号链接(类似 rm -rf

按深度优先顺序删除目录。符号链接作为链接被删除且永不跟随,因此指向树外的链接会保持其目标完好无损。路径缺失时操作成功,使该操作具有幂等性。

a:临时子路径的分配器 p:要删除的路径 ret:成功时为 none,或一个错误

rec TempFile

pub rec TempFile;

创建的临时文件及其路径

file:打开的文件句柄 path:分配的路径(使用调用者的分配器释放)

fun temp_create

pub fun temp_create(a: *A.Allocator, prefix: str) R.Result[TempFile, str];

在操作系统临时目录下创建一个具有唯一名称的临时文件

该文件以 O_CREAT|O_EXCL 打开,因此返回的路径由调用者独占拥有。

a:路径的分配器 prefix:名称前缀(例如 "build" -> "<tmp>/build_<hex>"ret:创建的临时文件,或一个错误

fun temp_path

pub fun temp_path(tf: *TempFile) Path;

临时文件的路径

fun temp_close

pub fun temp_close(tf: *TempFile) O.Option[str];

关闭临时文件而不删除它

fun temp_remove

pub fun temp_remove(tf: *TempFile) O.Option[str];

从磁盘中删除临时文件

fun temp_close_and_remove

pub fun temp_close_and_remove(tf: *TempFile) O.Option[str];

关闭并删除临时文件