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  }