Files
EdgeNode/internal/utils/bfs/file_reader.go

90 lines
1.7 KiB
Go
Raw Permalink Normal View History

2024-07-27 15:42:50 +08:00
// Copyright 2024 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cloud .
package bfs
import (
"errors"
"io"
"os"
2024-07-27 15:42:50 +08:00
"github.com/iwind/TeaGo/types"
)
type FileReader struct {
2024-04-27 07:09:14 +08:00
bFile *BlocksFile
fp *os.File
2024-04-27 07:09:14 +08:00
fileHeader *FileHeader
pos int64
isClosed bool
}
2024-04-26 18:44:29 +08:00
func NewFileReader(bFile *BlocksFile, fp *os.File, fileHeader *FileHeader) *FileReader {
return &FileReader{
2024-04-26 18:44:29 +08:00
bFile: bFile,
fp: fp,
fileHeader: fileHeader,
}
}
2024-04-26 18:44:29 +08:00
func (this *FileReader) FileHeader() *FileHeader {
return this.fileHeader
}
func (this *FileReader) Read(b []byte) (n int, err error) {
n, err = this.ReadAt(b, this.pos)
this.pos += int64(n)
return
}
func (this *FileReader) ReadAt(b []byte, offset int64) (n int, err error) {
2024-04-26 18:44:29 +08:00
if offset >= this.fileHeader.MaxOffset() {
err = io.EOF
return
}
2024-04-26 18:44:29 +08:00
blockInfo, ok := this.fileHeader.BlockAt(offset)
if !ok {
err = errors.New("could not find block at '" + types.String(offset) + "'")
return
}
var delta = offset - blockInfo.OriginOffsetFrom
var bFrom = blockInfo.BFileOffsetFrom + delta
var bTo = blockInfo.BFileOffsetTo
if bFrom > bTo {
err = errors.New("invalid block information")
return
}
var bufLen = len(b)
if int64(bufLen) > bTo-bFrom {
bufLen = int(bTo - bFrom)
}
2024-04-27 07:09:14 +08:00
AckReadThread()
2024-04-27 17:29:12 +08:00
n, err = this.fp.ReadAt(b[:bufLen], bFrom)
ReleaseReadThread()
return
}
2024-04-27 07:09:14 +08:00
func (this *FileReader) Reset(fileHeader *FileHeader) {
this.fileHeader = fileHeader
this.pos = 0
}
func (this *FileReader) Close() error {
if this.isClosed {
return nil
}
this.isClosed = true
2024-04-27 07:09:14 +08:00
return this.bFile.CloseFileReader(this)
}
func (this *FileReader) Free() error {
return this.fp.Close()
}