gpt4 book ai didi

go - 从 io.ReadWriteSeeker 中删除字节(通过文件)

转载 作者:IT王子 更新时间:2023-10-29 02:20:15 25 4
gpt4 key购买 nike

假设我有一个 io.ReadWriteSeeker 正在从某个文件中读取内容。

在某些时候,我决定要从文件中删除一些字节(特别是末尾)并减少其长度。

解决这个问题的正确方法是什么?

  • 我不能只通过搜索来覆盖它,因为我想以一个较短的文件结束。

  • io.CopyN 同样不起作用(因为 src 小于 dest)

最佳答案

如果 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)
}

Playground :https://play.golang.org/p/pp4IUSoKo4M

输出:

test data
test dat

关于go - 从 io.ReadWriteSeeker 中删除字节(通过文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52730473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com