package filecache
import (
"encoding/hex"
"errors"
"io"
"os"
"path"
"path/filepath"
)
func New (dir string ) Cache {
return newFileCache (dir )
}
func newFileCache(dir string ) *fileCache {
return &fileCache {dirPath : dir }
}
type fileCache struct {
dirPath string
}
func (fc *fileCache ) path (key Key ) string {
return path .Join (fc .dirPath , hex .EncodeToString (key [:]))
}
func (fc *fileCache ) Get (key Key ) (content io .ReadCloser , ok bool , err error ) {
f , err := os .Open (fc .path (key ))
if errors .Is (err , os .ErrNotExist ) {
return nil , false , nil
} else if err != nil {
return nil , false , err
} else {
return f , true , nil
}
}
func (fc *fileCache ) Add (key Key , content io .Reader ) (err error ) {
path := fc .path (key )
dirPath , fileName := filepath .Split (path )
file , err := os .CreateTemp (dirPath , fileName +".*.tmp" )
if err != nil {
return
}
defer func () {
file .Close ()
if err != nil {
_ = os .Remove (file .Name ())
}
}()
if _, err = io .Copy (file , content ); err != nil {
return
}
if err = file .Sync (); err != nil {
return
}
if err = file .Close (); err != nil {
return
}
err = os .Rename (file .Name (), path )
return
}
func (fc *fileCache ) Delete (key Key ) (err error ) {
err = os .Remove (fc .path (key ))
if errors .Is (err , os .ErrNotExist ) {
err = nil
}
return
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .