文件系统操作
学习目标
- 掌握文件读写
- 掌握目录操作
- 理解 Path 和 PathBuf
核心概念
文件读写
use std::fs;
fn main() -> std::io::Result<()> {
fs::write("hello.txt", "Hello, World!")?;
let content = fs::read_to_string("hello.txt")?;
println!("{}", content);
let bytes = fs::read("hello.txt")?;
println!("{:?}", bytes);
use std::fs::OpenOptions;
use std::io::Write;
let mut file = OpenOptions::new()
.append(true)
.open("hello.txt")?;
writeln!(file, "New line")?;
Ok(())
}
目录操作
use std::fs;
fn main() -> std::io::Result<()> {
fs::create_dir("my_dir")?;
fs::create_dir_all("path/to/dir")?;
for entry in fs::read_dir(".")? {
let entry = entry?;
println!("{}", entry.path().display());
}
fs::remove_file("file.txt")?;
fs::remove_dir("my_dir")?;
fs::remove_dir_all("path")?;
fs::copy("from.txt", "to.txt")?;
fs::rename("old.txt", "new.txt")?;
Ok(())
}
Path 和 PathBuf
use std::path::{Path, PathBuf};
fn main() {
let path = Path::new("/home/user/file.txt");
println!("文件名: {:?}", path.file_name());
println!("扩展名: {:?}", path.extension());
println!("目录: {:?}", path.parent());
println!("存在: {}", path.exists());
println!("是文件: {}", path.is_file());
println!("是目录: {}", path.is_dir());
let mut path = PathBuf::from("/home");
path.push("user");
path.push("file.txt");
println!("{}", path.display());
path.set_extension("md");
println!("{}", path.display());
}
文件元数据
use std::fs;
fn main() -> std::io::Result<()> {
let metadata = fs::metadata("hello.txt")?;
println!("大小: {} bytes", metadata.len());
println!("只读: {}", metadata.permissions().readonly());
println!("修改时间: {:?}", metadata.modified()?);
Ok(())
}
临时文件
use std::fs::File;
use std::io::Write;
fn main() -> std::io::Result<()> {
let dir = std::env::temp_dir();
let path = dir.join("temp_file.txt");
let mut file = File::create(&path)?;
writeln!(file, "temporary data")?;
println!("临时文件: {}", path.display());
fs::remove_file(path)?;
Ok(())
}
实践练习
练习 1:目录统计
use std::fs;
use std::path::Path;
fn count_files(dir: &Path) -> std::io::Result<(usize, usize)> {
let mut files = 0;
let mut dirs = 0;
for entry in fs::read_dir(dir)? {
let entry = entry?;
let path = entry.path();
if path.is_dir() {
dirs += 1;
let (f, d) = count_files(&path)?;
files += f;
dirs += d;
} else {
files += 1;
}
}
Ok((files, dirs))
}
fn main() -> std::io::Result<()> {
let (files, dirs) = count_files(Path::new("."))?;
println!("文件: {}, 目录: {}", files, dirs);
Ok(())
}
小结
| 操作 | 函数 |
|---|
| 读文件 | fs::read_to_string, fs::read |
| 写文件 | fs::write |
| 创建目录 | fs::create_dir_all |
| 遍历 | fs::read_dir |
| 路径 | Path, PathBuf |