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  }