Rust 文件系统操作
std::fs 与 Path/PathBuf 的文件读写、目录与错误处理要点。
#type / concept
#status / growing
#tech / dev
#resource / rust
[!info] 关联笔记
Rust 文件系统操作
这个概念为什么出现
配置、模板、数据文件都落在文件系统。
需要可移植的路径类型与清晰的错误上下文。
[!abstract] 一句话理解
Path/PathBuf表示路径;std::fs提供读写下目录;错误带路径上下文;注意 TOCTOU 与权限。
最小可运行示例
场景:读取应用配置文件文本
use std::fs;
use std::path::Path;
// 业务意图:读取配置文本;失败带路径。
// 教学点:Path;read_to_string;错误映射。
fn load_text(path: &Path) -> Result<String, String> {
fs::read_to_string(path).map_err(|e| format!("read {}: {e}", path.display()))
}
fn main() {
// 用临时策略:写入再读,保证可运行
let p = Path::new("tf_demo_config.txt");
fs::write(p, "log=info
").unwrap();
println!("{}", load_text(p).unwrap());
let _ = fs::remove_file(p);
}
建议运行:cargo run
期望包含 log=info。
结合场景再看三个关注点
display()打印路径- 错误上下文
- 二进制用
fs::read
核心概念
Path非 UTF-8 可能(OsStr)create_dir_all、read_dirOpenOptions精细打开- 元数据
metadata
工程实践
- 路径别手拼字符串
- 临时文件用专业 crate 或标准库 tempfile 模式
- 权限与符号链接安全
- 大文件流式读
本节总结
- Path + fs
- 错误上下文
- 可移植意识
自测题
Path与String路径差别?- 为何避免“先 exists 再 open”作为安全检查?
参考答案
- Path 处理 OS 路径语义与非 UTF8。
- TOCTOU 竞态;应直接 open 并处理错误。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| std::fs | 标准库 | 文件系统 |
| std::path | 标准库 | 路径 |