mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-26 21:30:55 +08:00
116 lines
4.8 KiB
Markdown
116 lines
4.8 KiB
Markdown
[#]: subject: "How to read and write files in Rust"
|
||
[#]: via: "https://opensource.com/article/23/1/read-write-files-rust"
|
||
[#]: author: "Stephan Avenwedde https://opensource.com/users/hansic99"
|
||
[#]: collector: "lkxed"
|
||
[#]: translator: "geekpi"
|
||
[#]: reviewer: "wxy"
|
||
[#]: publisher: "wxy"
|
||
[#]: url: "https://linux.cn/article-15442-1.html"
|
||
|
||
如何在 Rust 中读取和写入文件
|
||
======
|
||
|
||
> 跟随这个演示,学习如何在 Rust 中使用文件系统模块。
|
||
|
||
![][0]
|
||
|
||
知道如何读写文件对各种用途都很有用。在 Rust 中,这项任务是通过标准库中的文件系统模块([std::fs][1])完成的。在这篇文章中,我将向你介绍如何使用这个模块。
|
||
|
||
为了演示这项任务,我准备了一些示例代码,也可以在 [GitHub][2] 上找到。
|
||
|
||
### 准备工作
|
||
|
||
在使用 Rust 时,失败的函数会返回 [Result][3] 类型。尤其是文件系统模块会返回专门的类型 [std::io::Result<T, Error>][4]。有了这些知识,你可以从 `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][5] 函数的语法是非常先进的。第一个参数是文件路径,它必须是 [std::path::Path][6] 类型。第二个参数是内容,它实际上是一个字节切片(`[u8]`)。Rust 将传递的参数转换为正确的类型。幸运的是,这些类型基本上是下面的例子中所处理的唯一类型。
|
||
|
||
使用文件描述符类型 [std::fs::File][7] 可以实现对写操作更简洁的访问:
|
||
|
||
```
|
||
let mut file = fs::File::create("favorite_websites.txt")?;
|
||
file.write_all(b"opensource.com\n")?;
|
||
Ok(())
|
||
```
|
||
|
||
由于文件类型实现了 [Write][8] 特性,所以可以使用相关的方法来写入文件。然而,`create` 方法可以覆盖一个已经存在的文件。
|
||
|
||
为了获得对文件描述符的更多控制,必须使用 [std::fs::OpenOptions][9] 类型。这提供了类似于其他语言中的打开模式:
|
||
|
||
```
|
||
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][10] 函数,如果文件包含二进制数据,该函数会将数据读成一个字节向量。
|
||
|
||
下一个例子显示了如何将文件的内容读入内存,随后逐行打印到控制台:
|
||
|
||
```
|
||
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 中,当相关变量超出作用域,文件句柄就会被释放。为了定义关闭行为,可以在文件表示的周围应用作用域 `({ })`。我建议你熟悉 [Read][11] 和 [Write][8] 特性,因为你可以在许多其他类型中找到这个特性的实现。
|
||
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
via: https://opensource.com/article/23/1/read-write-files-rust
|
||
|
||
作者:[Stephan Avenwedde][a]
|
||
选题:[lkxed][b]
|
||
译者:[geekpi](https://github.com/geekpi)
|
||
校对:[wxy](https://github.com/wxy)
|
||
|
||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||
|
||
[a]: https://opensource.com/users/hansic99
|
||
[b]: https://github.com/lkxed
|
||
[1]: https://doc.rust-lang.org/std/fs/
|
||
[2]: https://github.com/hANSIc99/rust_file_io
|
||
[3]: https://doc.rust-lang.org/std/result/enum.Result.html
|
||
[4]: https://doc.rust-lang.org/std/io/type.Result.html
|
||
[5]: https://doc.rust-lang.org/std/fs/fn.write.html
|
||
[6]: https://doc.rust-lang.org/std/path/struct.Path.html
|
||
[7]: https://doc.rust-lang.org/std/fs/struct.File.html
|
||
[8]: https://doc.rust-lang.org/std/io/trait.Write.html
|
||
[9]: https://doc.rust-lang.org/std/fs/struct.OpenOptions.html#
|
||
[10]: https://doc.rust-lang.org/std/fs/fn.read.html
|
||
[11]: https://doc.rust-lang.org/std/io/trait.Read.html
|
||
[0]: https://opensource.com/sites/default/files/lead-images/rust_programming_crab_sea.png |