gotosocial/vendor/github.com/dsoprea/go-utility/v2/filesystem/copy_bytes_between_positions.go
2022-01-23 14:41:31 +01:00

41 lines
888 B
Go

package rifs
import (
"io"
"os"
"github.com/dsoprea/go-logging"
)
// CopyBytesBetweenPositions will copy bytes from one position in the given RWS
// to an earlier position in the same RWS.
func CopyBytesBetweenPositions(rws io.ReadWriteSeeker, fromPosition, toPosition int64, count int) (n int, err error) {
defer func() {
if state := recover(); state != nil {
err = log.Wrap(state.(error))
}
}()
if fromPosition <= toPosition {
log.Panicf("from position (%d) must be larger than to position (%d)", fromPosition, toPosition)
}
br, err := NewBouncebackReader(rws)
log.PanicIf(err)
_, err = br.Seek(fromPosition, os.SEEK_SET)
log.PanicIf(err)
bw, err := NewBouncebackWriter(rws)
log.PanicIf(err)
_, err = bw.Seek(toPosition, os.SEEK_SET)
log.PanicIf(err)
written, err := io.CopyN(bw, br, int64(count))
log.PanicIf(err)
n = int(written)
return n, nil
}