Rust 文件 I/O 高级应用指南

张开发
2026/4/15 18:12:04 15 分钟阅读

分享文章

Rust 文件 I/O 高级应用指南
Rust 文件 I/O 高级应用指南1. 基本文件操作在 Rust 中文件 I/O 操作主要通过std::fs模块来实现。use std::fs; fn main() - Result(), Boxdyn std::error::Error { // 读取文件 let content fs::read_to_string(example.txt)?; println!(File content: {}, content); // 写入文件 fs::write(output.txt, Hello, World!)?; println!(File written successfully); Ok(()) }2. 高级文件操作2.1 文件元数据use std::fs; use std::os::unix::fs::MetadataExt; fn main() - Result(), Boxdyn std::error::Error { let metadata fs::metadata(example.txt)?; println!(File size: {} bytes, metadata.len()); println!(Is file: {}, metadata.is_file()); println!(Is directory: {}, metadata.is_dir()); println!(Permissions: {:?}, metadata.permissions()); // Unix 特有的元数据 println!(Inode: {}, metadata.ino()); println!(Mode: {:o}, metadata.mode()); Ok(()) }2.2 目录操作use std::fs; fn main() - Result(), Boxdyn std::error::Error { // 创建目录 fs::create_dir(new_dir)?; println!(Directory created); // 创建多级目录 fs::create_dir_all(parent/child/grandchild)?; println!(Nested directories created); // 读取目录内容 let entries fs::read_dir(.)?; for entry in entries { let entry entry?; let path entry.path(); if path.is_dir() { println!(Directory: {:?}, path); } else { println!(File: {:?}, path); } } // 删除目录 fs::remove_dir(new_dir)?; println!(Directory deleted); // 删除多级目录 fs::remove_dir_all(parent)?; println!(Nested directories deleted); Ok(()) }2.3 文件权限use std::fs; use std::fs::Permissions; use std::os::unix::fs::PermissionsExt; fn main() - Result(), Boxdyn std::error::Error { // 设置文件权限 let mut permissions Permissions::default(); permissions.set_mode(0o644); // rw-r--r-- fs::set_permissions(example.txt, permissions)?; println!(Permissions set); // 获取文件权限 let metadata fs::metadata(example.txt)?; println!(Permissions: {:o}, metadata.permissions().mode()); Ok(()) }3. 低级文件操作3.1 使用File结构use std::fs::File; use std::io::{Read, Write}; fn main() - Result(), Boxdyn std::error::Error { // 打开文件只读 let mut file File::open(example.txt)?; let mut content String::new(); file.read_to_string(mut content)?; println!(File content: {}, content); // 创建文件写入 let mut file File::create(output.txt)?; file.write_all(bHello, World!)?; println!(File written successfully); // 打开文件追加 let mut file OpenOptions::new() .append(true) .open(output.txt)?; file.write_all(b\nAppended content)?; println!(Content appended); Ok(()) }3.2 使用OpenOptionsuse std::fs::OpenOptions; use std::io::Write; fn main() - Result(), Boxdyn std::error::Error { let mut file OpenOptions::new() .write(true) .create(true) .truncate(true) .open(output.txt)?; file.write_all(bHello, World!)?; println!(File written successfully); Ok(()) }4. 异步文件操作使用tokio::fs模块可以进行异步文件操作。use tokio::fs; #[tokio::main] async fn main() - Result(), Boxdyn std::error::Error { // 异步读取文件 let content fs::read_to_string(example.txt).await?; println!(File content: {}, content); // 异步写入文件 fs::write(output.txt, Hello, World!).await?; println!(File written successfully); // 异步创建目录 fs::create_dir(new_dir).await?; println!(Directory created); // 异步读取目录 let entries fs::read_dir(.).await?; for entry in entries { let entry entry?; let path entry.path(); if path.is_dir() { println!(Directory: {:?}, path); } else { println!(File: {:?}, path); } } Ok(()) }5. 实际应用场景5.1 读取大文件对于大文件我们可以使用流式读取避免一次性加载全部内容到内存。use std::fs::File; use std::io::{BufRead, BufReader}; fn main() - Result(), Boxdyn std::error::Error { let file File::open(large_file.txt)?; let reader BufReader::new(file); for line in reader.lines() { let line line?; println!({}, line); } Ok(()) }5.2 写入大文件对于大文件我们可以使用流式写入。use std::fs::File; use std::io::{BufWrite, BufWriter}; fn main() - Result(), Boxdyn std::error::Error { let file File::create(large_output.txt)?; let mut writer BufWriter::new(file); for i in 0..1000000 { writeln!(writer, Line {}, i)?; } writer.flush()?; println!(File written successfully); Ok(()) }5.3 文件复制use std::fs; fn main() - Result(), Boxdyn std::error::Error { fs::copy(source.txt, destination.txt)?; println!(File copied successfully); Ok(()) }5.4 文件重命名use std::fs; fn main() - Result(), Boxdyn std::error::Error { fs::rename(old_name.txt, new_name.txt)?; println!(File renamed successfully); Ok(()) }6. 最佳实践使用Result类型对于可能失败的文件操作使用Result类型返回错误。使用?运算符使用?运算符简洁地传播错误。使用缓冲区对于大文件使用BufReader和BufWriter来提高 I/O 性能。异步 I/O对于 I/O 密集型应用使用异步 I/O 来提高性能。错误处理提供清晰的错误信息便于调试。7. 总结Rust 的文件 I/O 系统提供了丰富的功能从基本的文件读写到高级的文件元数据操作。通过掌握文件 I/O 的高级应用我们可以编写更加高效、可靠的文件处理代码。在实际应用中我们可以根据具体需求选择合适的文件操作方法从简单的fs::read_to_string到复杂的异步文件操作。希望本文对你理解和应用 Rust 文件 I/O 有所帮助

更多文章