如何在 Rust 中读写文件

跟随此演示学习如何在 Rust 中使用文件系统模块。
1 位读者喜欢这篇文章。
Ferris the crab under the sea, unofficial logo for Rust programming language

Opensource.com

了解如何读写文件对于各种目的都很有用。在 Rust 中,此任务是使用标准库中的文件系统模块 (std::fs) 完成的。在本文中,我将概述如何使用此模块。

为了演示此任务,我准备了示例代码,该代码也可在 GitHub 上找到。

准备工作

使用 Rust 时,失败的函数会返回 Result 类型。特别是文件系统模块返回专门的类型 std::io::Result<T, Error>。 了解了这些知识后,您可以从 main() 函数返回相同的类型

fn  main() ->  std::io::Result<()> {
/* ...code comes here... */

写入 Rust 文件

在 Rust 中执行文件 I/O 操作相对容易。写入文件可以简化为一行代码

use  std::fs;
fs::write("favorite_websites.txt", b"opensource.com")?;
Ok(())

使用错误传播运算符 (?),错误信息会传递给调用函数,在那里可以随后处理错误。由于 main() 是调用堆栈中唯一的另一个函数,因此如果写入操作失败,错误信息会传递到控制台输出。

fs::write 函数的语法非常直接。第一个参数是文件路径,必须是 std::path::Path 类型。第二个参数是内容,实际上是字节切片 ([u8])。Rust 会将传递的参数转换为正确的类型。幸运的是,这些类型基本上是以下示例中唯一处理的类型。

使用文件描述符类型 std::fs::File 可以更简洁地访问写入操作

let mut file = fs::File::create("favorite_websites.txt")?;
file.write_all(b"opensource.com\n")?;
Ok(())

由于文件类型实现了 Write trait,因此可以使用关联的方法写入文件。但是,create 方法可以覆盖已存在的文件。

为了获得对文件描述符的更多控制,必须使用 std::fs::OpenOptions 类型。这提供了类似于其他语言的打开模式

let mut file = fs::OpenOptions::new()
                            .append(true)
                            .open("favorite_websites.txt")?;
                            
file.write_all(b"sourceforge.net\n")?;

读取 Rust 文件

适用于写入的也适用于读取。读取也可以用简单的一行代码完成

let websites = fs::read_to_string("favorite_websites.txt")?;

上面这行代码读取文件内容并返回一个字符串。除了读取字符串之外,还有 std::fs::read 函数,如果文件包含二进制数据,则该函数将数据读取到字节向量中。

下一个示例展示了如何将文件内容读取到内存中,然后逐行打印到控制台

let file = fs::File::open("favorite_websites.txt")?;
let lines = io::BufReader::new(file).lines();

for line in lines {
    if let Ok(_line) = line {
        println!(">>> {}", _line);
    }
}

总结

如果您已经熟悉其他编程语言,您可能已经注意到没有 close- 函数(或类似的东西)来释放文件句柄。在 Rust 中,文件句柄在相关变量超出作用域后立即释放。要定义关闭行为,可以在文件表示周围应用作用域 ({ })。我建议您熟悉 ReadWrite trait,因为您可以在许多其他类型中找到此 trait 的实现。

标签
User profile image.
Stephan 是一位技术爱好者,他欣赏开源,因为它能深入了解事物的工作原理。Stephan 在工业自动化软件这个主要为专有领域的公司担任全职支持工程师。如果可能,他会从事他基于 Python 的开源项目、撰写文章或驾驶摩托车。

评论已关闭。

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.