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