微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Rust 写入文件之前删除文件的内容?

如何解决如何在 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 标志,因为您实际上并未从日志文件中读取数据。

由于 writecreatetruncate 是非常常见的标志组合,所以有一个捷径:您不需要使用更底层的 {{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 举报,一经查实,本站将立刻删除。