Ch 23: std::fs文件系统
std::fs模块提供了文件系统操作的高级API,包括目录遍历、文件复制、目录创建删除等。
2. read_dir目录遍历
Section titled “2. read_dir目录遍历”2.1 基本用法
Section titled “2.1 基本用法”use std::fs;
fn main() -> std::io::Result<()> { // 读取当前目录 for entry in fs::read_dir(".")? { let entry = entry?; let path = entry.path(); let name = entry.file_name();
if path.is_dir() { println!("[DIR] {}", name.to_string_lossy()); } else { let size = entry.metadata()?.len(); println!("[FILE] {} ({} bytes)", name.to_string_lossy(), size); } }
Ok(())}2.2 ReadDir迭代器
Section titled “2.2 ReadDir迭代器”use std::fs::{self, ReadDir};
fn main() -> std::io::Result<()> { let dir: ReadDir = fs::read_dir(".")?;
// ReadDir实现了Iterator<Item=Result<DirEntry>> let entries: Vec<_> = dir .filter_map(|e| e.ok()) .filter(|e| e.path().is_file()) .collect();
println!("文件数量: {}", entries.len());
Ok(())}3. DirEntry结构
Section titled “3. DirEntry结构”use std::fs;
fn main() -> std::io::Result<()> { let entry = fs::read_dir(".")?.next().unwrap()?;
// 文件名 println!("file_name: {:?}", entry.file_name());
// 路径 println!("path: {:?}", entry.path());
// 是否有子目录 println!("is_file: {}", entry.file_type()?.is_file()); println!("is_dir: {}", entry.file_type()?.is_dir());
// 元数据 let metadata = entry.metadata()?; println!("size: {}", metadata.len());
Ok(())}4. copy文件复制
Section titled “4. copy文件复制”use std::fs;
fn main() -> std::io::Result<()> { // 创建测试文件 fs::write("source.txt", "Hello, world!")?;
// copy 复制文件 fs::copy("source.txt", "dest.txt")?;
// 验证复制 let content = fs::read_to_string("dest.txt")?; println!("复制的内容: {}", content);
// 清理 fs::remove_file("source.txt")?; fs::remove_file("dest.txt")?;
Ok(())}5. create_dir创建目录
Section titled “5. create_dir创建目录”5.1 基本用法
Section titled “5.1 基本用法”use std::fs;
fn main() -> std::io::Result<()> { // 创建单层目录 fs::create_dir("new_dir")?;
println!("目录创建成功");
// 清理 fs::remove_dir("new_dir")?;
Ok(())}5.2 create_dir_all创建多层目录
Section titled “5.2 create_dir_all创建多层目录”use std::fs;
fn main() -> std::io::Result<()> { // 创建嵌套目录 fs::create_dir_all("a/b/c/d")?;
println!("嵌套目录创建成功");
// 验证 assert!(fs::metadata("a/b/c/d")?.is_dir());
// 清理 fs::remove_dir_all("a")?;
Ok(())}6. remove_dir删除目录
Section titled “6. remove_dir删除目录”use std::fs;
fn main() -> std::io::Result<()> { // 创建测试目录 fs::create_dir("test_dir")?;
// remove_dir 只能删除空目录 fs::remove_dir("test_dir")?;
println!("空目录删除成功");
// 删除非空目录用 remove_dir_all fs::create_dir_all("nonempty/sub")?; fs::write("nonempty/file.txt", "content")?;
fs::remove_dir_all("nonempty")?;
println!("非空目录删除成功");
Ok(())}7. remove_file删除文件
Section titled “7. remove_file删除文件”use std::fs;
fn main() -> std::io::Result<()> { // 创建测试文件 fs::write("to_delete.txt", "temporary content")?;
// remove_file 删除文件 fs::remove_file("to_delete.txt")?;
println!("文件删除成功");
Ok(())}8. rename重命名/移动
Section titled “8. rename重命名/移动”use std::fs;
fn main() -> std::io::Result<()> { // 创建测试文件 fs::write("old_name.txt", "content")?;
// rename 重命名或移动 fs::rename("old_name.txt", "new_name.txt")?;
// 跨目录移动 fs::create_dir("subdir")?; fs::rename("new_name.txt", "subdir/moved.txt")?;
// 验证 assert!(fs::metadata("subdir/moved.txt")?.is_file());
// 清理 fs::remove_dir_all("subdir")?;
Ok(())}9. 硬链接和符号链接
Section titled “9. 硬链接和符号链接”use std::fs;
fn main() -> std::io::Result<()> { // 创建测试文件 fs::write("original.txt", "content")?;
// hard_link 创建硬链接 fs::hard_link("original.txt", "hard_link.txt")?;
// symlink 创建符号链接(需要管理员权限Windows) #[cfg(unix)] std::os::unix::fs::symlink("original.txt", "sym_link.txt")?;
// 验证 let meta = fs::metadata("hard_link.txt")?; println!("硬链接 inode: {:?}", meta.ino()); println!("硬链接 nlink: {}", meta.nlink());
// 清理 fs::remove_file("original.txt")?; fs::remove_file("hard_link.txt")?; #[cfg(unix)] fs::remove_file("sym_link.txt")?;
Ok(())}10. metadata与symlink_metadata
Section titled “10. metadata与symlink_metadata”use std::fs;
fn main() -> std::io::Result<()> { fs::write("file.txt", "content")?;
#[cfg(unix)] std::os::unix::fs::symlink("file.txt", "sym.txt")?;
// metadata 跟随符号链接 let meta = fs::metadata("file.txt")?; println!("metadata - size: {}", meta.len());
// symlink_metadata 不跟随符号链接 #[cfg(unix)] { let sym_meta = fs::symlink_metadata("sym.txt")?; println!("symlink_metadata - is_symlink: {}", sym_meta.file_type().is_symlink()); }
// 清理 fs::remove_file("file.txt")?; #[cfg(unix)] fs::remove_file("sym.txt")?;
Ok(())}11. copy实战:备份脚本
Section titled “11. copy实战:备份脚本”use std::fs;use std::io;
fn backup_file(src: &str, dst: &str) -> io::Result<u64> { fs::copy(src, dst)}
fn backup_directory(src: &str, dst: &str) -> io::Result<()> { // 读取源目录 for entry in fs::read_dir(src)? { let entry = entry?; let src_path = entry.path(); let dst_path = dst.to_string() + "/" + entry.file_name().to_str().unwrap();
if src_path.is_dir() { fs::create_dir_all(&dst_path)?; backup_directory(&src_path.to_string_lossy(), &dst_path)?; } else { fs::copy(&src_path, &dst_path)?; } } Ok(())}
fn main() -> io::Result<()> { // 创建测试目录 fs::create_dir_all("backup_test/src/subdir")?; fs::write("backup_test/src/file1.txt", "content 1")?; fs::write("backup_test/src/file2.txt", "content 2")?; fs::write("backup_test/src/subdir/file3.txt", "content 3")?;
// 备份 backup_directory("backup_test/src", "backup_test/dst")?;
// 验证 let entries: Vec<_> = fs::read_dir("backup_test/dst")? .filter_map(|e| e.ok()) .collect(); println!("备份文件数: {}", entries.len());
// 清理 fs::remove_dir_all("backup_test")?;
println!("备份完成");
Ok(())}12. 函数汇总
Section titled “12. 函数汇总”| 函数 | 说明 |
|---|---|
read_dir | 读取目录 |
copy | 复制文件 |
create_dir | 创建目录 |
create_dir_all | 创建嵌套目录 |
remove_dir | 删除空目录 |
remove_dir_all | 删除目录及内容 |
remove_file | 删除文件 |
rename | 重命名/移动 |
hard_link | 创建硬链接 |
symlink | 创建符号链接 |
metadata | 获取元数据 |
symlink_metadata | 获取符号链接元数据 |
read_link | 读取符号链接目标 |
13. 总结
Section titled “13. 总结”今天我们学习了std::fs文件系统操作:
- read_dir - 遍历目录
- copy - 复制文件
- create_dir/create_dir_all - 创建目录
- remove_dir/remove_dir_all - 删除目录
- remove_file - 删除文件
- rename - 重命名或移动
- hard_link/symlink - 创建链接
- metadata - 获取文件信息
std::fs提供了完整的文件系统操作API,可以实现文件管理器、备份工具等功能。