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 }