github.com/shuguocloud/go-zero@v1.3.0/core/filex/rangereader.go (about) 1 package filex 2 3 import ( 4 "errors" 5 "os" 6 ) 7 8 // A RangeReader is used to read a range of content from a file. 9 type RangeReader struct { 10 file *os.File 11 start int64 12 stop int64 13 } 14 15 // NewRangeReader returns a RangeReader, which will read the range of content from file. 16 func NewRangeReader(file *os.File, start, stop int64) *RangeReader { 17 return &RangeReader{ 18 file: file, 19 start: start, 20 stop: stop, 21 } 22 } 23 24 // Read reads the range of content into p. 25 func (rr *RangeReader) Read(p []byte) (n int, err error) { 26 stat, err := rr.file.Stat() 27 if err != nil { 28 return 0, err 29 } 30 31 if rr.stop < rr.start || rr.start >= stat.Size() { 32 return 0, errors.New("exceed file size") 33 } 34 35 if rr.stop-rr.start < int64(len(p)) { 36 p = p[:rr.stop-rr.start] 37 } 38 39 n, err = rr.file.ReadAt(p, rr.start) 40 if err != nil { 41 return n, err 42 } 43 44 rr.start += int64(n) 45 return 46 }