pub def File: i32
一个打开的文件,由其文件描述符标识
pub def Kind: u8
路径所指向的目标类型
pub val KIND_OTHER: Kind = 0
pub val KIND_FILE: Kind = 1
pub val KIND_DIR: Kind = 2
pub val KIND_SYMLINK: Kind = 3
pub rec Metadata;
可移植的文件元数据
kind:文件、目录、符号链接或其他 size:字节大小 mode:原始权限/类型位(POSIX;在其他地方合成) modified:最后修改时间 accessed:最后访问时间 created:平台提供时的创建时间,否则为无(none)
pub val STDIN: File = 0
标准流,作为已打开的文件
pub val STDOUT: File = 1
pub val STDERR: File = 2
pub fun open(p: Path) R.Result[File, str];
打开一个文件用于读取
p:文件路径 ret:打开的文件,或一个错误
pub fun create(p: Path, mode: i32) R.Result[File, str];
创建或截断一个文件用于写入
p:文件路径 mode:新创建文件的权限位 ret:打开的文件,或一个错误
pub fun close(f: File) O.Option[str];
关闭一个打开的文件
f:要关闭的文件 ret:成功时为 none,或一个错误
pub fun sync(f: File) O.Option[str];
将打开的文件的数据和元数据刷新到其后备存储(backing storage)
f:要刷新的文件 ret:成功时为 none,或一个错误
pub fun read(f: File, buf: *u8, len: usize) R.Result[usize, str];
最多读取 len 字节到 buf 中
f:要读取的文件 buf:目标缓冲区 len:最大读取字节数 ret:已读取的字节数(文件末尾为 0),或一个错误
pub fun write(f: File, buf: *u8, len: usize) R.Result[usize, str];
从 buf 中写入最多 len 字节
f:要写入的文件 buf:源缓冲区 len:要写入的字节数 ret:已写入的字节数,或一个错误
pub fun seek(f: File, offset: i64, whence: i32) R.Result[i64, str];
重新定位文件偏移量
f:要进行 seek 的文件 offset:相对于 whence 的字节偏移量 whence:SEEK_SET、SEEK_CUR 或 SEEK_END ret:生成的绝对偏移量,或一个错误
pub fun reader(f: File) m_reader.Reader;
将文件适配为 io.Reader(该文件的生命周期必须长于 reader)
f:要读取的文件 ret:从 f 提取数据的 Reader
pub fun writer(f: File) m_writer.Writer;
将文件适配为 io.Writer(该文件的生命周期必须长于 writer)
f:要写入的文件 ret:向 f 写入数据的 Writer
pub fun read_bytes(a: *A.Allocator, p: Path) R.Result[Vector[u8], str];
将整个文件读取到已分配的字节缓冲区中
在文件的 Reader 之上组合了 io.read_all:随读随增长,因此不需要大小假设。调用者拥有返回的向量。
a:结果的分配器 p:文件路径 ret:文件内容,或一个错误
pub fun read_string(a: *A.Allocator, p: Path) R.Result[str, str];
将整个文件读取到已分配的、以空字符结尾的字符串中
获取文件的大小信息,并将 io.read_exact 组合到精确大小的缓冲区中,仅分配一次且无需增长。适用于文本;当通过 str_len 读取时,包含嵌入式 NUL 字节的二进制内容会将其长度截断到第一个 NUL 处。
a:结果的分配器 p:文件路径 ret:文件内容,或一个错误
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,或一个错误
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,或一个错误
pub fun stat_of(f: File) R.Result[Metadata, str];
打开文件的元数据
f:要查询的文件 ret:元数据,或一个错误
pub fun metadata(p: Path) R.Result[Metadata, str];
路径的元数据,会跟随最后的符号链接
p:要查询的路径 ret:元数据,或一个错误
pub fun metadata_link(p: Path) R.Result[Metadata, str];
路径的元数据,不跟随最后的符号链接
p:要查询的路径 ret:元数据(符号链接会报告其自身),或一个错误
pub fun meta_is_dir(m: *Metadata) bool;
检查元数据是否描述了一个目录
pub fun meta_is_file(m: *Metadata) bool;
检查元数据是否描述了一个常规文件
pub fun meta_is_symlink(m: *Metadata) bool;
检查元数据是否描述了一个符号链接
pub fun exists(p: Path) bool;
检查路径是否存在(作为任何条目,包括断开的符号链接)
pub fun is_file(p: Path) bool;
检查路径是否为现有的常规文件(会跟随符号链接)
pub fun is_dir(p: Path) bool;
检查路径是否为现有的目录(会跟随符号链接)
pub fun is_symlink(p: Path) bool;
检查路径是否为符号链接(不跟随它)
pub fun create_dir(p: Path, mode: i32) O.Option[str];
创建一个单层目录
p:目录路径 mode:权限位 ret:成功时为 none,或一个错误
pub fun remove_file(p: Path) O.Option[str];
删除单个文件或符号链接
p:要删除的路径 ret:成功时为 none,或一个错误
pub fun remove_dir(p: Path) O.Option[str];
删除一个空目录
p:要删除的目录路径 ret:成功时为 none,或一个错误
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,或一个错误
pub fun read_dir(a: *A.Allocator, p: Path) R.Result[Vector[str], str];
列出目录中的条目,排除 . 和 ..
每个名称都是由调用者的分配器拥有的、新分配的字符串;返回的向量拥有它们,并通过 vector.dnit(或由 arena 整体释放)来释放。按目录顺序列出名称。
a:向量及每个名称的分配器 p:目录路径 ret:子项名称,或一个错误
pub fun create_dir_all(a: *A.Allocator, p: Path, mode: i32) O.Option[str];
创建一个目录以及所有缺失的父目录(类似 mkdir -p)
a:临时父路径的分配器 p:目录路径 mode:所创建目录的权限位 ret:成功时为 none,或一个错误
pub fun remove_all(a: *A.Allocator, p: Path) O.Option[str];
递归删除文件、目录树或符号链接(类似 rm -rf)
按深度优先顺序删除目录。符号链接作为链接被删除且永不跟随,因此指向树外的链接会保持其目标完好无损。路径缺失时操作成功,使该操作具有幂等性。
a:临时子路径的分配器 p:要删除的路径 ret:成功时为 none,或一个错误
pub rec TempFile;
创建的临时文件及其路径
file:打开的文件句柄 path:分配的路径(使用调用者的分配器释放)
pub fun temp_create(a: *A.Allocator, prefix: str) R.Result[TempFile, str];
在操作系统临时目录下创建一个具有唯一名称的临时文件
该文件以 O_CREAT|O_EXCL 打开,因此返回的路径由调用者独占拥有。
a:路径的分配器 prefix:名称前缀(例如 "build" -> "<tmp>/build_<hex>") ret:创建的临时文件,或一个错误
pub fun temp_path(tf: *TempFile) Path;
临时文件的路径
pub fun temp_close(tf: *TempFile) O.Option[str];
关闭临时文件而不删除它
pub fun temp_remove(tf: *TempFile) O.Option[str];
从磁盘中删除临时文件
pub fun temp_close_and_remove(tf: *TempFile) O.Option[str];
关闭并删除临时文件