разработка

This commit is contained in:
S.Solodyagin
2025-10-29 00:59:52 +03:00
parent 6a7f3a2ef4
commit 4799a2175f
13 changed files with 295 additions and 481 deletions
+15 -17
View File
@@ -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 проверяет: существует ли файл в хранилище?