github.com/kyleu/dbaudit@v0.0.2-0.20240321155047-ff2f2c940496/app/lib/filesystem/fswrite.go (about) 1 // Package filesystem - Content managed by Project Forge, see [projectforge.md] for details. 2 package filesystem 3 4 import ( 5 "io" 6 "os" 7 "path/filepath" 8 9 "github.com/pkg/errors" 10 ) 11 12 type Writer interface { 13 io.Writer 14 io.WriterAt 15 io.Closer 16 } 17 18 func (f *FileSystem) WriteFile(path string, content []byte, mode FileMode, overwrite bool) error { 19 p := f.getPath(path) 20 s, _ := f.f.Stat(p) 21 if s != nil && s.Size() > 0 && !overwrite { 22 return errors.Errorf("file [%s] exists, will not overwrite", p) 23 } 24 if mode == 0 { 25 if s == nil { 26 mode = DefaultMode 27 } else { 28 mode = FileMode(s.Mode()) 29 } 30 } 31 dd := filepath.Dir(path) 32 err := f.CreateDirectory(dd) 33 if err != nil { 34 return errors.Wrapf(err, "unable to create data directory [%s]", dd) 35 } 36 file, err := f.f.Create(p) 37 if err != nil { 38 return errors.Wrapf(err, "unable to create file [%s]", p) 39 } 40 err = f.SetMode(p, mode) 41 if err != nil { 42 return errors.Wrapf(err, "unable to set mode [%d] for file [%s]", mode, p) 43 } 44 defer func() { _ = file.Close() }() 45 _, err = file.Write(content) 46 if err != nil { 47 return errors.Wrapf(err, "unable to write content to file [%s]", p) 48 } 49 return nil 50 } 51 52 func (f *FileSystem) FileWriter(fn string, createIfNeeded bool, appendMode bool) (Writer, error) { 53 p := f.getPath(fn) 54 if createIfNeeded && !f.Exists(p) { 55 _, err := f.f.Create(p) 56 if err != nil { 57 return nil, err 58 } 59 } 60 mode := os.O_WRONLY 61 if appendMode { 62 mode = os.O_APPEND | os.O_WRONLY 63 } 64 return f.f.OpenFile(p, mode, os.ModeAppend) 65 }