gitlab.com/SkynetLabs/skyd@v1.6.9/skymodules/renter/filesystem/siadir/dirreader.go (about) 1 package siadir 2 3 import ( 4 "os" 5 ) 6 7 // DirReader is a helper type that allows reading a raw .siadir from disk while 8 // keeping the file in memory locked. 9 type DirReader struct { 10 f *os.File 11 sd *SiaDir 12 } 13 14 // Close closes the underlying file. 15 func (sdr *DirReader) Close() error { 16 defer sdr.sd.mu.Unlock() 17 return sdr.f.Close() 18 } 19 20 // Read calls Read on the underlying file. 21 func (sdr *DirReader) Read(b []byte) (int, error) { 22 return sdr.f.Read(b) 23 } 24 25 // Stat returns the FileInfo of the underlying file. 26 func (sdr *DirReader) Stat() (os.FileInfo, error) { 27 return sdr.f.Stat() 28 } 29 30 // DirReader creates a io.ReadCloser that can be used to read the raw SiaDir 31 // from disk. 32 func (sd *SiaDir) DirReader() (*DirReader, error) { 33 sd.mu.Lock() 34 if sd.deleted { 35 sd.mu.Unlock() 36 return nil, ErrDeleted 37 } 38 // Open file. 39 f, err := os.Open(sd.mdPath()) 40 if err != nil { 41 sd.mu.Unlock() 42 return nil, err 43 } 44 return &DirReader{ 45 sd: sd, 46 f: f, 47 }, nil 48 }