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