12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- package filex
- import (
- "errors"
- "os"
- )
- // A RangeReader is used to read a range of content from a file.
- type RangeReader struct {
- file *os.File
- start int64
- stop int64
- }
- // NewRangeReader returns a RangeReader, which will read the range of content from file.
- func NewRangeReader(file *os.File, start, stop int64) *RangeReader {
- return &RangeReader{
- file: file,
- start: start,
- stop: stop,
- }
- }
- // Read reads the range of content into p.
- func (rr *RangeReader) Read(p []byte) (n int, err error) {
- stat, err := rr.file.Stat()
- if err != nil {
- return 0, err
- }
- if rr.stop < rr.start || rr.start >= stat.Size() {
- return 0, errors.New("exceed file size")
- }
- if rr.stop-rr.start < int64(len(p)) {
- p = p[:rr.stop-rr.start]
- }
- n, err = rr.file.ReadAt(p, rr.start)
- if err != nil {
- return n, err
- }
- rr.start += int64(n)
- return
- }
|