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

结合场景再看三个关注点

  1. display() 打印路径
  2. 错误上下文
  3. 二进制用 fs::read

核心概念

  • Path 非 UTF-8 可能(OsStr
  • create_dir_allread_dir
  • OpenOptions 精细打开
  • 元数据 metadata

工程实践

  1. 路径别手拼字符串
  2. 临时文件用专业 crate 或标准库 tempfile 模式
  3. 权限与符号链接安全
  4. 大文件流式读

本节总结

  • Path + fs
  • 错误上下文
  • 可移植意识

自测题

  1. PathString 路径差别?
  2. 为何避免“先 exists 再 open”作为安全检查?
参考答案
  1. Path 处理 OS 路径语义与非 UTF8。
  2. TOCTOU 竞态;应直接 open 并处理错误。

延伸阅读与资料来源

资料类型支撑内容
std::fs标准库文件系统
std::path标准库路径
创建于 2026/7/15 更新于 2026/7/15