You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
1.3 KiB

5 years ago
  1. package backend
  2. import (
  3. "os"
  4. "time"
  5. )
  6. var (
  7. _ BackendStorageFile = &DiskFile{}
  8. )
  9. type DiskFile struct {
  10. File *os.File
  11. fullFilePath string
  12. fileSize int64
  13. modTime time.Time
  14. }
  15. func NewDiskFile(f *os.File) *DiskFile {
  16. return &DiskFile{
  17. fullFilePath: f.Name(),
  18. File: f,
  19. }
  20. }
  21. func (df *DiskFile) ReadAt(p []byte, off int64) (n int, err error) {
  22. return df.File.ReadAt(p, off)
  23. }
  24. func (df *DiskFile) WriteAt(p []byte, off int64) (n int, err error) {
  25. n, err = df.File.WriteAt(p, off)
  26. if err == nil {
  27. waterMark := off + int64(n)
  28. if waterMark > df.fileSize {
  29. df.fileSize = waterMark
  30. df.modTime = time.Now()
  31. }
  32. }
  33. return
  34. }
  35. func (df *DiskFile) Truncate(off int64) error {
  36. err := df.File.Truncate(off)
  37. if err == nil {
  38. df.fileSize = off
  39. df.modTime = time.Now()
  40. }
  41. return err
  42. }
  43. func (df *DiskFile) Close() error {
  44. return df.File.Close()
  45. }
  46. func (df *DiskFile) GetStat() (datSize int64, modTime time.Time, err error) {
  47. if df.fileSize != 0 {
  48. return df.fileSize, df.modTime, nil
  49. }
  50. stat, e := df.File.Stat()
  51. if e == nil {
  52. return stat.Size(), stat.ModTime(), nil
  53. }
  54. return 0, time.Time{}, err
  55. }
  56. func (df *DiskFile) Name() string {
  57. return df.fullFilePath
  58. }
  59. func (df *DiskFile) Sync() error {
  60. df.fileSize = 0
  61. return df.File.Sync()
  62. }