github.com/sagernet/sing@v0.2.6/service/filemanager/manager.go (about) 1 package filemanager 2 3 import ( 4 "context" 5 "os" 6 7 "github.com/sagernet/sing/service" 8 ) 9 10 type Manager interface { 11 BasePath(name string) string 12 OpenFile(name string, flag int, perm os.FileMode) (*os.File, error) 13 Create(name string) (*os.File, error) 14 CreateTemp(pattern string) (*os.File, error) 15 Mkdir(path string, perm os.FileMode) error 16 MkdirAll(path string, perm os.FileMode) error 17 } 18 19 func BasePath(ctx context.Context, name string) string { 20 manager := service.FromContext[Manager](ctx) 21 if manager == nil { 22 return name 23 } 24 return manager.BasePath(name) 25 } 26 27 func OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (*os.File, error) { 28 manager := service.FromContext[Manager](ctx) 29 if manager == nil { 30 return os.OpenFile(name, flag, perm) 31 } 32 return manager.OpenFile(name, flag, perm) 33 } 34 35 func Create(ctx context.Context, name string) (*os.File, error) { 36 manager := service.FromContext[Manager](ctx) 37 if manager == nil { 38 return os.Create(name) 39 } 40 return manager.Create(name) 41 } 42 43 func CreateTemp(ctx context.Context, pattern string) (*os.File, error) { 44 manager := service.FromContext[Manager](ctx) 45 if manager == nil { 46 return os.CreateTemp("", pattern) 47 } 48 return manager.CreateTemp(pattern) 49 } 50 51 func Mkdir(ctx context.Context, path string, perm os.FileMode) error { 52 manager := service.FromContext[Manager](ctx) 53 if manager == nil { 54 return os.Mkdir(path, perm) 55 } 56 return manager.Mkdir(path, perm) 57 } 58 59 func MkdirAll(ctx context.Context, path string, perm os.FileMode) error { 60 manager := service.FromContext[Manager](ctx) 61 if manager == nil { 62 return os.MkdirAll(path, perm) 63 } 64 return manager.MkdirAll(path, perm) 65 } 66 67 func WriteFile(ctx context.Context, name string, data []byte, perm os.FileMode) error { 68 manager := service.FromContext[Manager](ctx) 69 if manager == nil { 70 return os.WriteFile(name, data, perm) 71 } 72 file, err := manager.OpenFile(name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm) 73 if err != nil { 74 return err 75 } 76 if err != nil { 77 return err 78 } 79 _, err = file.Write(data) 80 if err1 := file.Close(); err1 != nil && err == nil { 81 err = err1 82 } 83 return err 84 }