¶ 文件管理
¶ mkdir
https://doc.rust-lang.org/std/fs/fn.create_dir.html
¶ mkdir -p
https://doc.rust-lang.org/std/fs/fn.create_dir_all.html
¶ mv
https://doc.rust-lang.org/std/fs/fn.rename.html
¶ 临时文件/目录
https://crates.io/crates/tempfile
临时目录:https://docs.rs/tempfile/latest/tempfile/fn.tempdir.html
¶ 获取文件长度
let file = File::open(path)?; |
参考:
https://doc.rust-lang.org/stable/std/fs/struct.File.html#method.metadata
https://doc.rust-lang.org/stable/std/fs/struct.Metadata.html
¶ Path
官方文档:https://doc.rust-lang.org/std/path/struct.Path.html
常用:
assert_eq!(Path::new("/etc").join("passwd"), PathBuf::from("/etc/passwd")); |
¶ 错误处理
官方文档:https://doc.rust-lang.org/std/io/struct.Error.html
常用:
// On Linux |
¶ 从文件中读取整型
如果只用标准库里的safe rust的话,只能先读进一个buffer里,然后再转成integer:https://stackoverflow.com/questions/70466567/read-binary-file-in-units-of-f64-in-rust。定义buffer的时候一般得初始化为0,而且后面将buffer转换成integer也需要一次复制(虽然可能会被编译器优化掉)。例子:
let mut reader = io::Cursor::new([1u8, 2u8, 3u8, 4u8]); |
相关:
https://github.com/rust-lang/rfcs/blob/master/text/2930-read-buf.md
https://docs.rs/binread/latest/binread/
¶ 从文件中逐行读取
let file = File::open("path")?; |
值得注意的是,io::stdin()
也可以这样:
for line in io::stdin().lines() { |
¶ 在文件中从后往前逐行读取
用crate rev_lines
: https://github.com/mjc-gh/rev_lines
或者crate rev_buf_reader
: https://github.com/andre-vm/rev_buf_reader
相关讨论:https://users.rust-lang.org/t/idiomatic-way-of-reading-a-text-file-line-by-line-in-reverse/8547
但是这两个crate好像都没有prefetch,导致每次读取都要卡一下。