首页 > 解决方案 > 如何修改文件的内容而不是在 Rust 中添加到文件中?

问题描述

我以为你只是打开一个文件并寻找你想要覆盖并开始写入的位置,但它似乎只在那个位置添加字节。如何从文件中删除字节或覆盖字节?

一个例子:

use std::fs::OpenOptions;
use std::io::{prelude::*, Seek, SeekFrom};

fn main() {
    let mut file = OpenOptions::new()
        .read(true)
        .append(true)
        .create(true)
        .open("/tmp/file.db")
        .unwrap();

    let bytes: [u8; 4] = [1, 2, 3, 4];

    file.seek(SeekFrom::Start(0)).unwrap();
    file.write_all(&bytes).unwrap();
}

之前的输出文件:

00000000: 0102 0304 0a                             .....

之后的输出文件:

00000000: 0102 0304 0102 0304 0a                   .........

如您所见,寻求 0 不会覆盖文件中已有的 4 个字节。相反,它将它们添加到文件中。

标签: rust

解决方案


这是因为您使用的是append(true). 从文档中:

此选项为 true 时,意味着写入将附加到文件而不是覆盖以前的内容。请注意,设置.write(true).append(true)与仅设置具有相同的效果.append(true)

改为使用write(true),添加写权限:

let mut file = OpenOptions::new()
    .read(true)
    .write(true) // <--------- this
    .create(true)
    .open("/tmp/file.db")
    .unwrap();

..您的代码将按预期工作。


推荐阅读