Rust 文件处理

在计算机编程中,文件处理是处理文件中数据的一种方式。文件处理使我们能够打开、读取、写入、创建和更新本地系统上的文件。

文件处理通常由许多应用程序执行,包括数据库和 Web 服务器。它是 I/O (输入/输出) 操作如何工作的关键示例。

文件处理通常也称为文件 I/O。


Rust 中的 File Struct

在 Rust 中,std::fs::File struct 表示一个文件。它允许我们对文件执行读/写操作。

文件 I/O 通过 std::fs 模块执行,该模块提供了用于处理文件系统的函数。

File struct 中的所有方法都返回 std::io::Result 的变体,或者直接返回 Result 枚举。

让我们通过以下操作来了解 Rust 中文件 I/O 的基础知识:

  • 打开文件
  • 从文件读取
  • 写入文件
  • 删除文件
  • 追加到文件

在 Rust 中打开文件

要在 Rust 中打开文件,我们使用 File::open() 方法。此方法将文件路径作为参数,并返回一个 File 对象。如果文件不存在,它会返回一个错误 (Err)。

让我们看一个例子。

use std::fs::File;

fn main() {
    // Open a file in read only mode in the local file system
    let data_result = File::open("data.txt");

    // Reading a file returns a Result enum
    // Result can be a file or an error
    let data_file = match data_result {
        Ok(file) => file,
        Err(error) => panic!("Problem opening the data file: {:?}", error),
    };

    println!("Data file: {:?}", data_file);
}

输出

Data file: File { fd: 3, path: "/code/rust-practice/data.txt", read: true, write: false }

在这里,我们在程序的顶部导入 std::fs::File 模块以使用文件 I/O 函数。

要打开文件,我们调用 File::open("data.txt"),它会读取本地文件系统中的 data.txt 文件。

open() 函数返回一个 Result 枚举,该枚举将返回 File 对象或 Err

然后,我们对 data_result 变量进行模式匹配,如果打开文件时出错,则使用 panic!。如果打开文件没有出错,我们输出 File 对象。


在 Rust 中读取文件

要在 Rust 中读取文件,我们使用 std::io::Read trait 的 read_to_string() 方法。此方法一直读取字节直到文件结束 (EOF),并将其复制到一个可变字符串中。

这是一个示例。

use std::fs::File;
use std::io::Read;

fn main() {
    // Read a file in the local file system
    let mut data_file = File::open("data.txt").unwrap();

    // Create an empty mutable string
    let mut file_content = String::new();

    // Copy contents of file to a mutable string
    data_file.read_to_string(&mut file_content).unwrap();

    println!("File content: {:?}", file_content);
}

输出

File content: "The quick brown fox jumps over the lazy dog.\n"

在这里,我们导入两个模块:std::fs::Filestd::io::Read 来读取文件。我们首先使用 File::open("data.txt") 方法调用打开 data.txt 文件,并将其结果绑定到变量 data_file

打开文件后,我们使用 read_to_string() 方法,该方法将一个空的、可变的字符串 file_content 作为参数,并将 data.txt 文件的内容复制到 file_content 中。

注意

  • 我们使用两次 unwrap() 来获取方法调用的结果。unwrap() 是一个用于处理 OptionResult 类型的实用方法。要了解更多信息,请访问 Rust unwrap() 和 expect()
  • read_to_string() 来自 std::io::Read trait。要了解更多信息,请访问 Rust Trait

在 Rust 中写入文件

要在 Rust 中写入文件,我们可以使用 std::io::Write trait 中的 write() 方法。此方法将内容写入文件。

让我们看一个例子。

use std::fs::File;
use std::io::Write;

fn main() {
    // Create a file
    let mut data_file = File::create("data.txt").expect("creation failed");

    // Write contents to the file
    data_file.write("Hello, World!".as_bytes()).expect("write failed");

    println!("Created a file data.txt");
}

输出

Created a file data.txt

在这里,我们导入 std::fs::Filestd::io::Write 模块以写入文件。我们首先使用 File::create("data.txt") 方法创建 data.txt 文件,并将其绑定到一个可变的变量 data_file

创建文件后,我们使用 write() 方法写入内容 "Hello, World!"


在 Rust 中删除文件

要在 Rust 中删除或移除文件,我们可以使用 std::fs 模块中的 remove_file() 方法。

例如,

use std::fs;

fn main() {
    // Remove a file
    fs::remove_file("data.txt").expect("could not remove file");
    
    println!("Removed file data.txt");
}

输出

Removed file data.txt

在这里,我们导入 std::fs 模块来删除文件。我们使用 remove_file() 方法删除 data.txt 文件。

如果操作未成功,我们将返回自定义消息:如果出错,则为 无法删除文件

如果找不到 data.txt 文件或无法删除,我们会遇到错误。

thread 'main' panicked at 'could not remove file: Os { code: 2, kind: NotFound, message: "No such file or directory" }', src/main.rs:5:33

在 Rust 中追加到文件

要在 Rust 中追加到文件,我们应该以追加模式打开文件。我们可以在 std::fs::OpenOptions 中使用 append() 方法,该方法为追加打开文件。

然后,我们可以使用 std::io::Write trait 中的 write() 方法将数据写入文件。

让我们看一个例子。

use std::fs::OpenOptions;
use std::io::Write;

fn main() {
    // Open a file with append option
    let mut data_file = OpenOptions::new()
        .append(true)
        .open("data.txt")
        .expect("cannot open file");

    // Write to a file
    data_file
        .write("I am learning Rust!".as_bytes())
        .expect("write failed");

    println!("Appended content to a file");
}

输出

Appended to a file

在这里,我们导入 std::fs::OpenOptionsstd::io::Write 模块以追加到文件。

OpenOptions::new()append(true) 方法以追加模式打开 data.txt 文件。

接下来,我们使用 File 对象中的 write() 方法将附加内容 "I am learning Rust!" 写入文件。

为了处理错误,我们使用带有自定义错误消息的 expect() 方法进行链式调用。

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战