2023-08-27 21:14:23 +08:00
|
|
|
|
package model
|
|
|
|
|
|
|
2025-07-12 17:57:54 +08:00
|
|
|
|
import (
|
|
|
|
|
|
"errors"
|
|
|
|
|
|
"io"
|
|
|
|
|
|
)
|
2023-08-27 21:14:23 +08:00
|
|
|
|
|
|
|
|
|
|
// File is basic file level accessing interface
|
|
|
|
|
|
type File interface {
|
|
|
|
|
|
io.Reader
|
|
|
|
|
|
io.ReaderAt
|
|
|
|
|
|
io.Seeker
|
|
|
|
|
|
}
|
2025-07-12 17:57:54 +08:00
|
|
|
|
type FileCloser struct {
|
|
|
|
|
|
File
|
|
|
|
|
|
io.Closer
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (f *FileCloser) Close() error {
|
|
|
|
|
|
var errs []error
|
|
|
|
|
|
if clr, ok := f.File.(io.Closer); ok {
|
|
|
|
|
|
errs = append(errs, clr.Close())
|
|
|
|
|
|
}
|
|
|
|
|
|
if f.Closer != nil {
|
|
|
|
|
|
errs = append(errs, f.Closer.Close())
|
|
|
|
|
|
}
|
|
|
|
|
|
return errors.Join(errs...)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-04 23:56:09 +08:00
|
|
|
|
// FileRangeReader 是对 RangeReaderIF 的轻量包装,表明由 RangeReaderIF.RangeRead
|
|
|
|
|
|
// 返回的 io.ReadCloser 同时实现了 model.File(即支持 Read/ReadAt/Seek)。
|
|
|
|
|
|
// 只有满足这些才需要使用 FileRangeReader,否则直接使用 RangeReaderIF 即可。
|
2025-07-12 17:57:54 +08:00
|
|
|
|
type FileRangeReader struct {
|
|
|
|
|
|
RangeReaderIF
|
|
|
|
|
|
}
|