From 042f83dcd11dc2ee78eca444931bc406f4001017 Mon Sep 17 00:00:00 2001 From: movsb Date: Sat, 22 Jun 2024 19:39:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E4=BF=AE=E5=A4=8D=EF=BC=9Aht?= =?UTF-8?q?tps://github.com/spf13/afero/issues/428?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/utils/fs.go | 2 +- service/modules/storage/storage.go | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/modules/utils/fs.go b/modules/utils/fs.go index 85de0b39..83c728b6 100644 --- a/modules/utils/fs.go +++ b/modules/utils/fs.go @@ -83,7 +83,7 @@ func ListBackupFiles(fsys fs.FS, dir string) ([]*proto.BackupFileSpec, error) { // NOTE:安全写:先写临时文件,再移动过去。临时文件写在目标目录,不存在跨设备移动文件的问题。 // NOTE:如果 r 超过 size,会报错。 func WriteFile(fs afero.Fs, path string, mode fs.FileMode, modified time.Time, size int64, r io.Reader) error { - tmp, err := afero.TempFile(fs, filepath.Dir(path), `taoblog-*`) + tmp, err := afero.TempFile(fs, `.`, `taoblog-*`) if err != nil { return err } diff --git a/service/modules/storage/storage.go b/service/modules/storage/storage.go index cd98cb74..f5cf63db 100644 --- a/service/modules/storage/storage.go +++ b/service/modules/storage/storage.go @@ -5,7 +5,6 @@ import ( "io" "io/fs" fspkg "io/fs" - "os" "path/filepath" "time" @@ -86,7 +85,8 @@ func (fs *Storage) Sub(dir string) (fspkg.FS, error) { if err != nil { return nil, err } - return &_FsOpen{afero.NewBasePathFs(fs.root, path)}, nil + // TODO: afero 有个 bug:https://github.com/spf13/afero/issues/428 + return &Storage{root: afero.NewBasePathFs(fs.root, "/"+path)}, nil } // 会自动创建不存在的目录。 @@ -115,7 +115,7 @@ func (fs *Storage) Stat(name string) (fspkg.FileInfo, error) { if err != nil { return nil, err } - return os.Stat(path) + return fs.root.Stat(path) } func (fs *Storage) ReadDir(name string) ([]fspkg.DirEntry, error) { @@ -123,5 +123,12 @@ func (fs *Storage) ReadDir(name string) ([]fspkg.DirEntry, error) { if err != nil { return nil, err } - return os.ReadDir(path) + fi, err := afero.ReadDir(fs.root, path) + if err != nil { + return nil, err + } + + return utils.Map(fi, func(i fspkg.FileInfo) fspkg.DirEntry { + return fspkg.FileInfoToDirEntry(i) + }), nil }