From b95d23e9c8af390a2dd1fa7a6dbfdc189ffc2652 Mon Sep 17 00:00:00 2001 From: "S.Solodyagin" Date: Tue, 5 May 2026 11:13:53 +0300 Subject: [PATCH] fix: IsExists --- remote/miniostorage/miniostorage.go | 43 ++++------------------------- remote/storage.go | 10 ++----- storage.go | 12 +++++--- 3 files changed, 15 insertions(+), 50 deletions(-) diff --git a/remote/miniostorage/miniostorage.go b/remote/miniostorage/miniostorage.go index 0c376c7..546b66d 100644 --- a/remote/miniostorage/miniostorage.go +++ b/remote/miniostorage/miniostorage.go @@ -5,7 +5,6 @@ import ( "io" "net/http" "path" - "strings" "git.company.local/gopkg/filestore/remote" "github.com/minio/minio-go/v7" @@ -81,45 +80,13 @@ func (s *MinioStorage) Stat(name string) (remote.FileInfo, error) { return newMinioFileInfo(info), nil } -func (s *MinioStorage) Exists(name string) (bool, error) { - name = path.Join(s.cfg.Prefix, name) - - // Сначала проверяем, является ли путь файлом - if ok, err := s.IsFile(name); err == nil && ok { - return true, nil - } - // Если не файл, то проверяем, является ли путь каталогом - return s.IsDir(name) -} - -func (s *MinioStorage) IsDir(name string) (bool, error) { - name = path.Join(s.cfg.Prefix, name) - - options := minio.ListObjectsOptions{ - Prefix: strings.TrimRight(name, "/") + "/", - Recursive: false, - MaxKeys: 1, - } - objectChan := s.client.ListObjects(s.ctx, s.cfg.BucketName, options) - object, ok := <-objectChan - if !ok { - return false, nil - } - if object.Err != nil { - return false, object.Err - } - return true, nil -} - -func (s *MinioStorage) IsFile(name string) (bool, error) { +func (s *MinioStorage) IsExists(name string) (bool, error) { name = path.Join(s.cfg.Prefix, name) _, err := s.client.StatObject(s.ctx, s.cfg.BucketName, name, minio.StatObjectOptions{}) - if err == nil { - return true, nil + if err != nil { + return false, err } - if strings.Contains(err.Error(), "The specified key does not exist.") { - return false, nil - } - return false, err + + return true, nil } diff --git a/remote/storage.go b/remote/storage.go index bf0cd37..0c4222f 100644 --- a/remote/storage.go +++ b/remote/storage.go @@ -32,14 +32,8 @@ type Storage interface { // Stat получает информацию о файле/каталоге. Stat(name string) (FileInfo, error) - // Exists определяет, существует ли файл или каталог. - Exists(name string) (bool, error) - - // IsDir определяет, является ли путь каталогом. - IsDir(name string) (bool, error) - - // IsFile определяет, является ли путь файлом. - IsFile(name string) (bool, error) + // IsExists определяет, существует ли файл. + IsExists(name string) (bool, error) Uploader() Uploader } diff --git a/storage.go b/storage.go index 42160be..491326a 100644 --- a/storage.go +++ b/storage.go @@ -393,16 +393,20 @@ func (s *LocalStorage) GetFullPath(name string) (string, error) { } // IsExists проверяет существование файла. -func (s *LocalStorage) IsExists(name string) bool { +func (s *LocalStorage) IsExists(name string) (bool, error) { fullPath, err := s.GetFullPath(name) if err != nil { - return false + return false, err } fi, err := os.Stat(fullPath) if err != nil { - return false + return false, err } - return !fi.IsDir() + if fi.IsDir() { + return false, fmt.Errorf("The specified file is a directory") + } + + return true, nil }