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  }