为什么文件要附加文本而不是替换其内容?

Why the file is appending text instead of replacing its contents?

提问人:JuanN 提问时间:11/14/2023 更新时间:11/14/2023 访问量:42

问:

我有一个文件,另一个里面有其他数据。我已经实现了一个函数来存储 de 其他数据 到文件中:structstruct

    pub struct DataHandler {
        pub file: File,
        other_data: OtherData,
    }
    impl DataHandler {
        fn write_to_file(&mut self) {
            self.file
                .write_all(toml::to_string(&self.other_data).unwrap().as_ref())
                .unwrap();
        }
    }

创建 后,文件将打开,并具有读取写入权限:DataHandler

        let file = OpenOptions::new()
            .read(true)
            .write(true)
            .create(true)
            .open(file_path)
            .unwrap();
        ...

        let mut handler = DataHandler { file, other_data};

每当调用该函数时,数据都会附加到文件中,尽管在文档中指出:write_to_filewrite

如果文件已存在,则对其的任何写入调用都将覆盖其内容

问题是,为什么调用会附加数据?是因为文件从未关闭(因为从未删除)吗?write_allDataHandler

我尝试存储一个变量而不是内部,并在每次要写入时打开文件,但在我看来效率很低。有什么解决方法吗?PathFileDataHandler

文件 生锈

评论


答:

2赞 cafce25 11/14/2023 #1

这是因为 (或 ) 将写入 的当前位置,该位置在每个 .其他一切都意味着您必须始终一次写入文件的全部内容,这不会非常符合人体工程学。writewrite_allFilewrite

在想从头开始写作之前,可以先搜索 SeekFrom::Start(0)。您可能还希望将 File::set_len 添加到您之后写入的字节数,否则您迟早会在写入数据后留下一些剩余的字节。

文档的意思是,它将从开头开始编写而不是附加,但它仍然会推进当前位置。write

评论

1赞 Chayim Friedman 11/14/2023
seek_from(SeekFrom::Start(0))可以写成 .rewind()