在Rust中以读写模式打开文件

12
在Rust中,我如何打开一个既可读又可写的文件?File::open()是只读的,而File::create()声称是只写的(还会创建文件,这不是我想要的)。
1个回答

18

从Rust 1.58版本开始(在我撰写此文时即将发布),你可以这样做:

use std::fs::File;

let mut file = File::options()
    .read(true)
    .write(true)
    .open("foo.txt")?;

在旧版本中,您可以使用OpenOptions结构打开该文件。它与上面的代码相同,但名称有点奇怪。

use std::fs::OpenOptions;

let mut file = OpenOptions::new()
    .read(true)
    .write(true)
    .open("foo.txt")?;

3
是的,这是标准库中建造者模式的用法之一。 - Boiethios
8
我认为使用方式有点奇怪。我本来期望建造者(Build)会构建一个OpenOptions对象,然后将其传递给File::open_with函数。OpenOptions却具有open方法,这感觉有些奇怪。 - Matthieu M.
1
这并不奇怪,它可以省略不必要的额外步骤。文件不是您构建的对象,而是您通常打开或创建的东西,这就是为什么最终方法是 .open() 而不是 .build() - user11877195
@Sahsahae:没有人建议它应该是.build()。这很奇怪,因为大多数人会期望let mut file = File::open_with_options("foo.txt", OpenOptions::new().read(true).write(true));。事实上,我刚刚检查了一下,这实际上就是内部实现方式。 - Timmmm
1
如果std过于方便,您始终可以使用libc::fopen - user11877195
在nightly版本中,您现在可以使用File::with_options().read(true).write(true).open("foo.txt")来做很多事情,这是更好的选择。:-) - Timmmm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接