71·标准库深入进阶

文件系统操作

文件系统操作

学习目标

  1. 掌握文件读写
  2. 掌握目录操作
  3. 理解 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

练习编辑器

rust
Loading...