如何在 Rust 中读取和写入文件
创始人
2024-03-02 14:09:00
0

跟随这个演示,学习如何在 Rust 中使用文件系统模块。

知道如何读写文件对各种用途都很有用。在 Rust 中,这项任务是通过标准库中的文件系统模块(std::fs)完成的。在这篇文章中,我将向你介绍如何使用这个模块。

为了演示这项任务,我准备了一些示例代码,也可以在 GitHub 上找到。

准备工作

在使用 Rust 时,失败的函数会返回 Result 类型。尤其是文件系统模块会返回专门的类型 std::io::Result。有了这些知识,你可以从 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 特性,所以可以使用相关的方法来写入文件。然而,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 特性,因为你可以在许多其他类型中找到这个特性的实现。


via: https://opensource.com/article/23/1/read-write-files-rust

作者:Stephan Avenwedde 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

微软定目标:2030年,彻...
编辑 | 泽南 忍不了了,微软要消灭 C 语言了? 最近几天,有关...
2026-01-19 19:27:16
原创 ...
文 |姑苏九歌 编辑 |姑苏九歌 Linux内核最近干了件大事,R...
2026-01-19 19:22:40
Linux内核首个涉及Ru...
12 月 18 日消息,Linux 内核维护者 Greg Kroa...
2025-12-18 17:17:28
最受欢迎的开源Rust跨平...
Iced 是一个为 Rust 语言设计的开源跨平台 GUI(图形用...
2025-12-10 17:16:12
开源可信MCP,AICC机...
2025-10-31 15:13:14 作者:狼叫兽 大模型技术...
2025-10-31 21:16:27
Java、Python等开...
IT之家 9 月 24 日消息,开源安全基金会(OpenSSF)昨...
2025-09-24 14:25:34

热门资讯

如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
Textual:为 Pytho... 快速入门使用 TextualPython 在 Linux 上有像 TkInter 这样的优秀 GUI...
硬核观察 #1245 Open... #1 OpenAI 悄然删除禁止将 ChatGPT 用于 “军事和战争” 的禁令在 1 月 10 日...
使用时间序列数据,用开源工具助... InfluxData 是一个开源的时间序列数据库平台。下面介绍了它是如何被用于边缘应用案例的。收集到...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
硬核观察 #1249 LG 洗... #1 LG 洗衣机每天上传近 4GB 的数据?一个名为 Johnie 的 LG 洗衣机用户发现,他的...
2024 年 Linux 和开... 让我们尝试预测未来吧!新的一年快乐,朋友们 ✨2024 年的钟声已经敲过,我们有必要去预见一下将塑造...