如何解决如何在 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
是非常常见的标志组合,所以有一个捷径:您不需要使用更底层的 {{1} } 接口,可以改为使用 File::create()
:
OpenOptions
let log_file = File::create(&log_file_name).unwrap();
的实现简单地使用 File::create()
拼出长版本:
OpenOptions
,
使用.truncate()
。示例:
let log_file = OpenOptions::new()
.read(true)
.write(true)
.create(true)
.truncate(true) // added here
.open(&log_file_name)
.unwrap();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。