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  }