разработка
This commit is contained in:
+15
-17
@@ -20,8 +20,8 @@ const tmpfileName = "<temporary file>"
|
||||
|
||||
// LocalStorage описывает хранилище файлов.
|
||||
type LocalStorage struct {
|
||||
dir string
|
||||
permissions os.FileMode
|
||||
rootDir string
|
||||
perm os.FileMode
|
||||
|
||||
mutexes struct {
|
||||
sync.Mutex
|
||||
@@ -33,9 +33,9 @@ type LocalStorage struct {
|
||||
type LocalStorageOption func(*LocalStorage)
|
||||
|
||||
// WithPermissions
|
||||
func WithPermissions(permissions os.FileMode) LocalStorageOption {
|
||||
return func(storage *LocalStorage) {
|
||||
storage.permissions = permissions
|
||||
func WithPermissions(perm os.FileMode) LocalStorageOption {
|
||||
return func(s *LocalStorage) {
|
||||
s.perm = perm
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,19 +50,17 @@ type FileInfo struct {
|
||||
}
|
||||
|
||||
// NewLocalStorage открывает и возвращает хранилище файлов.
|
||||
func NewLocalStorage(dir string, opts ...LocalStorageOption) (*LocalStorage, error) {
|
||||
func NewLocalStorage(rootDir string, opts ...LocalStorageOption) (*LocalStorage, error) {
|
||||
s := &LocalStorage{}
|
||||
s.dir = dir
|
||||
s.permissions = 0700
|
||||
s.rootDir = rootDir
|
||||
s.perm = 0700
|
||||
|
||||
for _, opt := range opts {
|
||||
if opt != nil {
|
||||
opt(s)
|
||||
}
|
||||
opt(s)
|
||||
}
|
||||
|
||||
// Создаём каталог, если он ещё не создан
|
||||
if err := os.MkdirAll(s.dir, s.permissions); err != nil {
|
||||
if err := os.MkdirAll(s.rootDir, s.perm); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -72,7 +70,7 @@ func NewLocalStorage(dir string, opts ...LocalStorageOption) (*LocalStorage, err
|
||||
// Create сохраняет файл в хранилище. В качестве имени файла используется комбинация из двух хешей.
|
||||
func (s *LocalStorage) Create(r io.Reader) (*FileInfo, error) {
|
||||
// Создаём временный файл в корневом каталоге
|
||||
tmpfile, err := os.CreateTemp(s.dir, "~tmp")
|
||||
tmpfile, err := os.CreateTemp(s.rootDir, "~tmp")
|
||||
if err != nil {
|
||||
err.(*os.PathError).Path = tmpfileName // Подмениваем имя файла
|
||||
return nil, err
|
||||
@@ -127,7 +125,7 @@ func (s *LocalStorage) Create(r io.Reader) (*FileInfo, error) {
|
||||
}
|
||||
|
||||
// Если такого файла нет, то создаем для него каталог
|
||||
if err := os.MkdirAll(filepath.Dir(fi.Location), s.permissions); err != nil {
|
||||
if err := os.MkdirAll(filepath.Dir(fi.Location), s.perm); err != nil {
|
||||
err.(*os.PathError).Path = fi.Name
|
||||
return nil, err
|
||||
}
|
||||
@@ -212,7 +210,7 @@ func (s *LocalStorage) Remove(name string) error {
|
||||
func (s *LocalStorage) Clean(lifetime time.Duration) error {
|
||||
// Удаляем вообще все файлы, если время жизни не задано
|
||||
if lifetime <= 0 {
|
||||
files, err := filepath.Glob(filepath.Join(s.dir, "*"))
|
||||
files, err := filepath.Glob(filepath.Join(s.rootDir, "*"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -226,7 +224,7 @@ func (s *LocalStorage) Clean(lifetime time.Duration) error {
|
||||
// Вычисляем крайнюю дату валидности файлов
|
||||
valid := time.Now().Add(-lifetime)
|
||||
|
||||
err := filepath.Walk(s.dir,
|
||||
err := filepath.Walk(s.rootDir,
|
||||
func(filename string, info os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -282,7 +280,7 @@ func (s *LocalStorage) GetFullName(name string) string {
|
||||
if len(name) < 27 {
|
||||
return ""
|
||||
}
|
||||
return filepath.Join(s.dir, name[:1], name[1:3], name[3:])
|
||||
return filepath.Join(s.rootDir, name[:1], name[1:3], name[3:])
|
||||
}
|
||||
|
||||
// IsExists проверяет: существует ли файл в хранилище?
|
||||
|
||||
Reference in New Issue
Block a user