如何在 Rust 中读取和写入文件
跟随这个演示，学习如何在 Rust 中使用文件系统模块。
Rust
跟随这个演示，学习如何在 Rust 中使用文件系统模块。

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


![](/data/attachment/album/202301/14/164230kzitifadjno49nq8.jpg)


知道如何读写文件对各种用途都很有用。在 Rust 中，这项任务是通过标准库中的文件系统模块（[std::fs](https://doc.rust-lang.org/std/fs/)）完成的。在这篇文章中，我将向你介绍如何使用这个模块。


为了演示这项任务，我准备了一些示例代码，也可以在 [GitHub](https://github.com/hANSIc99/rust_file_io) 上找到。


### 准备工作


在使用 Rust 时，失败的函数会返回 [Result](https://doc.rust-lang.org/std/result/enum.Result.html) 类型。尤其是文件系统模块会返回专门的类型 [std::io::Result<T, Error>](https://doc.rust-lang.org/std/io/type.Result.html)。有了这些知识，你可以从 `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](https://doc.rust-lang.org/std/fs/fn.write.html) 函数的语法是非常先进的。第一个参数是文件路径，它必须是 [std::path::Path](https://doc.rust-lang.org/std/path/struct.Path.html) 类型。第二个参数是内容，它实际上是一个字节切片（`[u8]`）。Rust 将传递的参数转换为正确的类型。幸运的是，这些类型基本上是下面的例子中所处理的唯一类型。


使用文件描述符类型 [std::fs::File](https://doc.rust-lang.org/std/fs/struct.File.html) 可以实现对写操作更简洁的访问：



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

```

由于文件类型实现了 [Write](https://doc.rust-lang.org/std/io/trait.Write.html) 特性，所以可以使用相关的方法来写入文件。然而，`create` 方法可以覆盖一个已经存在的文件。


为了获得对文件描述符的更多控制，必须使用 [std::fs::OpenOptions](https://doc.rust-lang.org/std/fs/struct.OpenOptions.html#) 类型。这提供了类似于其他语言中的打开模式：



```
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](https://doc.rust-lang.org/std/fs/fn.read.html) 函数，如果文件包含二进制数据，该函数会将数据读成一个字节向量。


下一个例子显示了如何将文件的内容读入内存，随后逐行打印到控制台：



```
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](https://doc.rust-lang.org/std/io/trait.Read.html) 和 [Write](https://doc.rust-lang.org/std/io/trait.Write.html) 特性，因为你可以在许多其他类型中找到这个特性的实现。




---


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


作者：[Stephan Avenwedde](https://opensource.com/users/hansic99) 选题：[lkxed](https://github.com/lkxed) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)


本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出

