如何在Rust写入文件之前删除文件的内容?
我编写了一个机器人,它每隔一段时间执行一次网络查询,并将最新状态转储到存储在磁盘上的文件中。这是我的代码:
let log_file = OpenOptions::new()
.read(true)
.write(true)
.create(true)
.open(&log_file_name)
.unwrap();
serde_json::to_writer(
log_file,
&State {
foo: self.foo,
bar: self.bar
},
)
.unwrap();
问题是,有时,最新状态 json 的大小会小于先前状态 JSON 的大小。这使得前一个状态 JSON 中比新状态 JSON 长的部分保留在日志文件中:
{"foo": 1,"bar": 2}"baz": 3}
在上面的示例中,"baz": 3}是来自先前状态 JSON 的剩余数据。
问题是:如何重写代码,以便首先刷新文件的所有内容,然后编写新的状态 json?
我知道删除文件是一种解决方案,但我不想这样做。
回答
您还需要该truncate标志,如果文件已存在,则该标志会导致文件被截断为长度 0。此外,您应该删除该read标志,因为您实际上并未从日志文件中读取数据。
由于write, create,truncate是非常常见的标志组合,因此有一个快捷方式:您不需要使用更底层的OpenOptions接口,而是可以使用File::create():
let log_file = File::create(&log_file_name).unwrap();
的实现File::create()简单地说明了长版本使用OpenOptions:
pub fn create<P: AsRef<Path>>(path: P) -> io::Result<File> {
OpenOptions::new().write(true).create(true).truncate(true).open(path.as_ref())
}