Удаление байтов из io.ReadWriteSeeker (через файл) - PullRequest
0 голосов
/ 10 октября 2018

Допустим, у меня есть io.ReadWriteSeeker, который читает запись из определенного файла.

В какой-то момент я решаю, что хочу удалить некоторые байты из файла (особенно конец) и уменьшить его длину.

Какой правильный путь для этого?

  • Я не могу просто перезаписать его поиском, потому что хочу получить более короткий файл.

  • io.CopyN также не будет работать (так как src меньше dest)

1 Ответ

0 голосов
/ 10 октября 2018

Если значение io.ReadWriteSeeker также поддерживает метод Truncate, например, значение * os.File.

Например,

package main

import (
    "fmt"
    "io"
    "io/ioutil"
    "os"
)

func truncate(rws io.ReadWriteSeeker, size int64) error {
    type Truncater interface {
        Truncate(size int64) error
    }
    t, ok := rws.(Truncater)
    if !ok {
        return fmt.Errorf("truncate: unable to truncate")
    }
    return t.Truncate(size)
}

func main() {
    filename := `/tmp/truncate.test.file`
    f, err := os.Create(filename)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    defer f.Close()
    n, err := f.Write([]byte("test data"))
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    data, err := ioutil.ReadFile(filename)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    fmt.Println(string(data))

    // truncate io.ReadWriteSeeker
    err = truncate(f, int64(n-1))
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }

    data, err = ioutil.ReadFile(filename)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    fmt.Println(string(data))
    os.Remove(filename)
}

Детская площадка: https://play.golang.org/p/pp4IUSoKo4M

Вывод:

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