Как вы изменяете содержимое файла вместо добавления к файлу в Rust? - PullRequest
0 голосов
/ 05 июня 2018

Я думал, что вы просто открываете файл и ищете позицию, которую хотите перезаписать, и начинаете запись, но кажется, что она добавляет только байты в этой позиции.Как удалить байты из файла или перезаписать байты?

Пример:

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 байта, уже находящихся в файле.Вместо этого он добавляет их к файлу.

1 Ответ

0 голосов
/ 05 июня 2018

Это потому, что вы используете 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();

.. и ваш кодбудет работать как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...