mirror of
https://github.com/simon-ding/polaris.git
synced 2026-03-02 07:30:47 +08:00
60 lines
1.3 KiB
Go
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)
|
|
|
|
}
|