diff --git a/pkg/storage/local.go b/pkg/storage/local.go index 438b4c6..36c6e08 100644 --- a/pkg/storage/local.go +++ b/pkg/storage/local.go @@ -55,19 +55,23 @@ func (l *LocalStorage) Move(src, destDir string) error { if info.IsDir() { os.Mkdir(destName, os.ModePerm) } else { //is file - if writer, err := os.OpenFile(destName, os.O_RDWR|os.O_CREATE|os.O_TRUNC, os.ModePerm); err != nil { - return errors.Wrapf(err, "create file %s", destName) - } else { - defer writer.Close() - if f, err := os.OpenFile(path, os.O_RDONLY, os.ModePerm); err != nil { - return errors.Wrapf(err, "read file %v", path) - } else { //open success - defer f.Close() - _, err := io.Copy(writer, f) - if err != nil { - return errors.Wrap(err, "transmitting data error") + if err := os.Link(path, destName); err != nil { + log.Warnf("hard file error, will try copy file, source: %s, dest: %s", path, destName) + if writer, err := os.OpenFile(destName, os.O_RDWR|os.O_CREATE|os.O_TRUNC, os.ModePerm); err != nil { + return errors.Wrapf(err, "create file %s", destName) + } else { + defer writer.Close() + if f, err := os.OpenFile(path, os.O_RDONLY, os.ModePerm); err != nil { + return errors.Wrapf(err, "read file %v", path) + } else { //open success + defer f.Close() + _, err := io.Copy(writer, f) + if err != nil { + return errors.Wrap(err, "transmitting data error") + } } } + } } log.Infof("file copy complete: %v", destName)