Skip to content

Ch 23: std::fs文件系统

std::fs模块提供了文件系统操作的高级API,包括目录遍历、文件复制、目录创建删除等。

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(())
}
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(())
}
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(())
}
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(())
}
use std::fs;
fn main() -> std::io::Result<()> {
// 创建单层目录
fs::create_dir("new_dir")?;
println!("目录创建成功");
// 清理
fs::remove_dir("new_dir")?;
Ok(())
}
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(())
}
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(())
}
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(())
}
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(())
}
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(())
}
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(())
}
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(())
}
函数说明
read_dir读取目录
copy复制文件
create_dir创建目录
create_dir_all创建嵌套目录
remove_dir删除空目录
remove_dir_all删除目录及内容
remove_file删除文件
rename重命名/移动
hard_link创建硬链接
symlink创建符号链接
metadata获取元数据
symlink_metadata获取符号链接元数据
read_link读取符号链接目标

今天我们学习了std::fs文件系统操作:

  1. read_dir - 遍历目录
  2. copy - 复制文件
  3. create_dir/create_dir_all - 创建目录
  4. remove_dir/remove_dir_all - 删除目录
  5. remove_file - 删除文件
  6. rename - 重命名或移动
  7. hard_link/symlink - 创建链接
  8. metadata - 获取文件信息

std::fs提供了完整的文件系统操作API,可以实现文件管理器、备份工具等功能。