diff --git a/internal/files/seek.go b/internal/files/seek.go index fad8ded..e83ce34 100644 --- a/internal/files/seek.go +++ b/internal/files/seek.go @@ -26,7 +26,7 @@ func NewSeeker(ctx context.Context, fsys FS, path string, size int64) *Seeker { } // Check opens the file now, from the start, so a file that cannot be read is known before -// any headers go out. A later seek elsewhere simply reopens. +// any headers go out. Seeking costs nothing; a Read from somewhere else reopens there. func (s *Seeker) Check() error { if s.cur != nil { return nil @@ -54,11 +54,7 @@ func (s *Seeker) Seek(offset int64, whence int) (int64, error) { if pos < 0 { return 0, errors.New("seek before start") } - if s.cur != nil && pos != s.at { - s.cur.Close() - s.cur = nil - } - s.pos = pos + s.pos = pos // the stream, if open, stays where it is until a Read wants somewhere else return pos, nil } @@ -66,6 +62,10 @@ func (s *Seeker) Read(p []byte) (int, error) { if s.pos >= s.size { return 0, io.EOF } + if s.cur != nil && s.pos != s.at { + s.cur.Close() + s.cur = nil + } if s.cur == nil { f, err := s.fsys.OpenAt(s.ctx, s.path, s.pos) if err != nil {