github.com/anacrolix/torrent@v1.61.0/storage/file-io-classic.go (about)

     1  package storage
     2  
     3  import (
     4  	"errors"
     5  	"io"
     6  	"os"
     7  )
     8  
     9  type classicFileIo struct{}
    10  
    11  func (me classicFileIo) rename(from, to string) error {
    12  	a := sharedFiles.CloseAll(from)
    13  	b := sharedFiles.CloseAll(to)
    14  	c := os.Rename(from, to)
    15  	if c != nil {
    16  		return errors.Join(a, b, c)
    17  	}
    18  	return nil
    19  }
    20  
    21  func (me classicFileIo) flush(name string, offset, nbytes int64) error {
    22  	return fsync(name)
    23  }
    24  
    25  func (me classicFileIo) openForSharedRead(name string) (sharedFileIf, error) {
    26  	return sharedFiles.Open(name)
    27  }
    28  
    29  func (me classicFileIo) openForRead(name string) (fileReader, error) {
    30  	f, err := os.Open(name)
    31  	return classicFileReader{f}, err
    32  }
    33  
    34  func (classicFileIo) openForWrite(p string, size int64) (f fileWriter, err error) {
    35  	return openFileExtra(p, os.O_WRONLY)
    36  }
    37  
    38  type classicFileReader struct {
    39  	*os.File
    40  }
    41  
    42  func (c classicFileReader) writeToN(w io.Writer, n int64) (written int64, err error) {
    43  	lw := limitWriter{
    44  		rem: n,
    45  		w:   w,
    46  	}
    47  	return c.File.WriteTo(&lw)
    48  }
    49  
    50  func (c classicFileReader) seekDataOrEof(offset int64) (ret int64, err error) {
    51  	ret, err = seekData(c.File, offset)
    52  	if err == io.EOF {
    53  		ret, err = c.File.Seek(0, io.SeekEnd)
    54  	}
    55  	return
    56  }