读写文件看起来很简单,细节却不少:文本与字节、错误的种类、写入时是覆盖还是截断、怎样写才不会让读者看到写了一半的文件。这篇用真实的文件系统与并发读者把这些都验证了。
编译:成功
运行(退出码 0):
fs::write 之后:大小 20 字节
fs::read_to_string: "第一行\n第二行\n"
fs::read 得到 20 个字节,前 6 个 [231, 172, 172, 228, 184, 128](UTF-8,每个汉字 3 字节)
写入非法 UTF-8 后 read_to_string: Err((InvalidData, "stream did not contain valid UTF-8"))
同一个文件 fs::read: [255, 254, 65] 编译:成功
运行(退出码 0):
不存在:kind = NotFound os_error = Some(2) 信息 = No such file or directory (os error 2)
只读文件以写方式打开:kind = PermissionDenied os_error = Some(13)
create_new 遇到已存在的文件:kind = AlreadyExists
把目录当文件读:kind = IsADirectory os_error = Some(21) 编译:成功
运行(退出码 0):
write(true) 只覆盖前 2 字节: "bbAAAAAA"
write + truncate: "cc"
append: "ccdd"
create(true) 创建了空文件,大小 0
File::create 会创建文件并截断已有内容:对已有内容的文件再 File::create →
内容被清空,大小 0 编译:成功
运行(退出码 0):
原子替换(tmp + rename)300 次期间,读者读到 完整的 A 1780 次、完整的 B 1525 次、撕裂的内容 0 次
直接 File::create 覆盖 300 次期间,读者读了 308 次,其中读到被截断/不完整内容 8 次文件描述符的释放见文件描述符与资源释放。结果的具体次数每次运行不同。
编译:成功
运行(退出码 0):
read_dir 的返回顺序: ["z.txt", "m.txt", "a", "a.txt"](文档不保证顺序);排序后 ["a", "a.txt", "m.txt", "z.txt"]
metadata(a): is_dir = true is_file = false
remove_dir 删除非空目录: Err(DirectoryNotEmpty)
remove_dir_all 之后目录还在吗: false路径类型见Path 与 PathBuf。