文章

Rust 处理文件

本文记录一些关于使用 Rust 处理文件的基础内容

Rust 处理文件

读取二进制文件

std::fs::read 函数可以按照二进制读取整个文件。

1
2
3
4
5
6
7
use std::fs;

fn read_bytes() {
    let data: Vec<u8> = fs::read("./rsc/sheet.png").unwrap();
    let mark: String = String::from_utf8(data[1..4].to_vec()).unwrap();
    println!("the mark: {}", mark);
}
1
the mark: PNG

读取文本文件

std::fs::read_to_string 函数可以按照文本读取文件。

1
2
3
4
5
6
use std::fs;

fn read_string() {
    let data: String = fs::read_to_string("./rsc/demo.txt").unwrap();
    println!("first word: {}", data[0..6].to_string());
}
1
first word: Lorem

打开文件并读取

1
2
3
4
5
6
7
8
9
use std::fs::File;
use std::io::Read;

fn open_and_read() {
    let mut f: File = File::open("./rsc/demo.txt").unwrap();
    let mut s: String = String::new();
    f.read_to_string(&mut s).unwrap();
    println!("first word: {}", s[0..6].to_string());
}

File::read_to_string 的签名是

1
fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize>

所以变量 f 需要声明为可变的,因为该函数的第一个参数是 &mut self

创建并写入

1
2
3
4
5
6
7
8
use std::fs::File;
use std::io::Write;

fn create_and_write() {
    let mut f: File = File::create("./rsc/test.txt").unwrap();
    let s: &str = "Hello world";
    f.write_all(s.as_bytes()).unwrap();
}

writewrite_all 的区别是,前者不一定会一次性写入指定的所有内容,而后者一定会全部写入所有内容。

因为往硬盘写入内容都是有缓冲的,有时候缓冲没满就不一定会写入,后者则强制全部写入为止。

OpenOptions 提供更多选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
use std::fs;
use std::fs::File;
use std::io::Read;

fn advance() {
    let mut file: File = fs::OpenOptions::new()
        .read(true)
        .write(true)
        .create(true)
        .open("./rsc/demo.txt").unwrap();
    let mut s: String = String::new();
    file.read_to_string(&mut s).unwrap();
    println!("first word: {}", s[0..6].to_string());
}

上述表示以读写模式打开文件,如果不存在就创建。详见 文档

创建目录

1
2
3
4
5
6
7
8
9
10
11
use std::fs;

//创建一个目录
fn create_dir() {
    fs::create_dir("./rsc/demod").unwrap();
}

//递归创建目录
fn create_multiple_dir() {
    fs::create_dir_all("./rsc/a/b/c").unwrap();
}

读取目录内容

1
2
3
4
5
6
7
8
9
use std::fs;
use std::fs::ReadDir;

fn list_files() {
    let paths: ReadDir = fs::read_dir("./rsc").unwrap();
    for path in paths {
        println!("> {:?}", path.unwrap().path())
    }
}
1
2
3
4
5
> "./rsc\\a"
> "./rsc\\demo.txt"
> "./rsc\\demod"
> "./rsc\\sheet.png"
> "./rsc\\test.txt"

删除文件和目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use std::fs;

//删除一个文件
fn remove_file() {
    fs::remove_file("./rsc/test.txt").unwrap();
}

//删除一个空目录
fn remove_empty_dir() {
    fs::remove_dir("./rsc/demod").unwrap();
}

//把目录里的内容全部删除,然后把目录本身也删除
fn remove_nonempty_dir() {
    fs::remove_dir_all("./rsc/a").unwrap();
}
本文由作者按照 CC BY 4.0 进行授权