Rust 文件系统操作入门
Rust 是一种现代系统编程语言,提供了强大且安全的文件系统交互工具。与许多其他语言不同,Rust 保证了内存和线程操作的安全性,这在输入输出操作中尤为重要。本文将详细介绍如何使用标准库 std::fs 和 std::path 创建、读取、写入文件和目录,管理路径以及处理错误。
本文内容既适合刚接触 Rust 的初学者,也适合希望巩固知识的有经验开发者。所有代码示例均可直接运行并附有注释。
核心模块与导入
在 Rust 中进行文件系统操作需要使用两个关键模块:
std::fs— 提供文件和文件夹操作函数(读取、写入、删除、复制等)。std::path— 包含用于路径操作的Path和PathBuf类型。
大多数任务只需添加以下导入:
use std::fs;use std::path::Path;use std::io::prelude::*; // 用于流操作文件操作:读取与写入
读取文件内容
将整个文件读取为字符串的最简单方法是使用 fs::read_to_string 函数。它返回 Result<String>,因此需要处理可能的错误。
use std::fs;
fn read_file(path: &str) -> Result<String, std::io::Error> { let content = fs::read_to_string(path)?; Ok(content)}
fn main() { match read_file("example.txt") { Ok(text) => println!("文件内容:{}", text), Err(e) => eprintln!("读取错误: {}", e), }}如果需要将文件读取为二进制数据,请使用 fs::read,它返回 Vec<u8>。
写入文件
使用 fs::write 将字符串写入文件。如果文件不存在,它会创建文件;如果文件已存在,则会覆盖。
use std::fs;
fn write_file(path: &str, content: &str) -> Result<(), std::io::Error> { fs::write(path, content)?; println!("文件写入成功"); Ok(())}
fn main() { let data = "Hello, Rust!第二行。"; if let Err(e) = write_file("output.txt", data) { eprintln!("写入错误: {}", e); }}如需追加内容到文件末尾或进行更精细的控制,请使用 OpenOptions:
use std::fs::OpenOptions;use std::io::Write;
fn append_to_file(path: &str, line: &str) -> Result<(), std::io::Error> { let mut file = OpenOptions::new() .append(true) .create(true) .open(path)?; writeln!(file, "{}", line)?; Ok(())}目录操作
创建和删除文件夹
使用 fs::create_dir(单个文件夹)或 fs::create_dir_all(递归创建,类似 mkdir -p)创建目录。
use std::fs;
fn main() -> Result<(), std::io::Error> { // 创建单个文件夹 fs::create_dir("my_folder")?;
// 递归创建嵌套文件夹 fs::create_dir_all("data/subdir/logs")?;
// 删除空文件夹 fs::remove_dir("my_folder")?;
// 递归删除文件夹及其所有内容 fs::remove_dir_all("data")?;
Ok(())}读取目录内容
fs::read_dir 函数返回目录条目的迭代器。每个条目是一个 DirEntry,可以从中获取名称、类型和元数据。
use std::fs;
fn list_directory(path: