writer.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package fileutil
  2. import (
  3. "io"
  4. "os"
  5. )
  6. // LockedFileWriter is an io.WriteCloser implementation of a writer that will use flock
  7. // for file locking during the write and unlock on close.
  8. type LockedFileWriter struct {
  9. f *os.File
  10. }
  11. // Creates a new FLocking file writer that will flock a file on open, and unlock when the writer is
  12. // closed.
  13. func NewLockedFileWriter(path string) (io.WriteCloser, error) {
  14. f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0666)
  15. if err != nil {
  16. return nil, err
  17. }
  18. if err := LockFile(f); err != nil {
  19. f.Close()
  20. return nil, err
  21. }
  22. if err := f.Truncate(0); err != nil {
  23. UnlockFile(f)
  24. f.Close()
  25. return nil, err
  26. }
  27. if _, err := f.Seek(0, io.SeekStart); err != nil {
  28. UnlockFile(f)
  29. f.Close()
  30. return nil, err
  31. }
  32. return &LockedFileWriter{
  33. f: f,
  34. }, nil
  35. }
  36. func (lf *LockedFileWriter) Write(p []byte) (int, error) {
  37. return lf.f.Write(p)
  38. }
  39. func (lf *LockedFileWriter) Close() error {
  40. if err := UnlockFile(lf.f); err != nil {
  41. lf.f.Close()
  42. return err
  43. }
  44. return lf.f.Close()
  45. }