Files
polaris/pkg/storage/local.go
2024-07-10 17:35:16 +08:00

60 lines
1.3 KiB
Go

package storage
import (
"io"
"io/fs"
"os"
"path/filepath"
"github.com/pkg/errors"
)
type Storage interface {
Move(src, dest string) error
ReadDir(dir string) ([]FileInfo, error)
}
func NewLocalStorage(dir string) *LocalStorage {
return &LocalStorage{dir: dir}
}
type LocalStorage struct {
dir string
}
func (l *LocalStorage) Move(src, dest string) error {
targetDir := filepath.Join(l.dir, dest)
err := filepath.Walk(src, func(path string, info fs.FileInfo, err error) error {
destName := filepath.Join(targetDir, info.Name())
srcName := filepath.Join(src, info.Name())
if info.IsDir() {
if err := os.Mkdir(destName, 0666); err != nil {
return errors.Wrapf(err, "mkdir %v", destName)
}
} else { //is file
if writer, err := os.Create(destName); err != nil {
return errors.Wrapf(err, "create file %s", destName)
} else {
defer writer.Close()
if f, err := os.OpenFile(srcName, os.O_RDONLY, 0666); err != nil {
return errors.Wrapf(err, "read file %v", srcName)
} else { //open success
defer f.Close()
_, err := io.Copy(writer, f)
if err != nil {
return errors.Wrap(err, "transmitting data error")
}
}
}
}
return nil
})
if err != nil {
return errors.Wrap(err, "move file error")
}
return os.RemoveAll(src)
}