mirror of
https://github.com/truewhile/MeBox.git
synced 2026-10-08 06:16:37 +08:00
优化,排查项目问题
This commit is contained in:
@@ -2,6 +2,7 @@ package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
@@ -219,24 +220,50 @@ func (o *OrganizerService) replaceVersions(ctx context.Context, src string, exis
|
||||
o.log.Warn("organize replace sidecar artwork failed",
|
||||
zap.String("from", src), zap.String("to", dst), zap.Error(err))
|
||||
}
|
||||
// New file is safely staged; the transfer succeeded so it is now safe to
|
||||
// supersede the existing lower-res versions.
|
||||
for _, e := range existing {
|
||||
if nfo := nfoPath(e); nfo != "" {
|
||||
_ = os.Remove(nfo)
|
||||
// New file is safely staged. 先把现有 dst 改名为备份、rename stage→dst
|
||||
// 成功后,才删除旧版本:此前顺序是先删旧版本再 rename,一旦 rename
|
||||
// 失败(Windows 下 dst 被播放器/杀软占用很常见),cleanup 会删掉
|
||||
// stage——旧版本已删、move 模式下源已不在、新文件也删,数据彻底丢失。
|
||||
var backup string
|
||||
if _, err := os.Stat(dst); err == nil {
|
||||
backup = dst + ".replacing-" + randomSuffix()
|
||||
if err := os.Rename(dst, backup); err != nil {
|
||||
cleanup()
|
||||
return fmt.Errorf("备份现有文件失败(可能被其他程序占用):%w", err)
|
||||
}
|
||||
if err := os.Remove(e); err != nil && !os.IsNotExist(err) {
|
||||
o.log.Warn("organize replace remove existing failed",
|
||||
zap.String("path", e), zap.Error(err))
|
||||
}
|
||||
if err := os.Rename(stage, dst); err != nil {
|
||||
if backup != "" {
|
||||
if rbErr := os.Rename(backup, dst); rbErr != nil {
|
||||
o.log.Error("organize replace restore backup failed",
|
||||
zap.String("backup", backup), zap.Error(rbErr))
|
||||
}
|
||||
}
|
||||
cleanup()
|
||||
return err
|
||||
}
|
||||
// 新文件已就位,现在才删除被取代的旧版本。dst 路径此时已是新文件,
|
||||
// 文件级删除必须跳过(DB 行仍按原语义清理)。
|
||||
for _, e := range existing {
|
||||
if e != dst {
|
||||
if nfo := nfoPath(e); nfo != "" {
|
||||
_ = os.Remove(nfo)
|
||||
}
|
||||
if err := os.Remove(e); err != nil && !os.IsNotExist(err) {
|
||||
o.log.Warn("organize replace remove existing failed",
|
||||
zap.String("path", e), zap.Error(err))
|
||||
}
|
||||
}
|
||||
if o.repo != nil && o.repo.DB != nil {
|
||||
_ = o.repo.DB.WithContext(ctx).Unscoped().Where("path = ?", e).Delete(&model.Media{}).Error
|
||||
}
|
||||
}
|
||||
// Move staged file + sidecars into the final path.
|
||||
if err := os.Rename(stage, dst); err != nil {
|
||||
cleanup()
|
||||
return err
|
||||
if backup != "" {
|
||||
// 备份文件即被取代的旧 dst 内容,新文件已成功落位后移除。
|
||||
if err := os.Remove(backup); err != nil && !os.IsNotExist(err) {
|
||||
o.log.Warn("organize replace remove backup failed",
|
||||
zap.String("path", backup), zap.Error(err))
|
||||
}
|
||||
}
|
||||
moveSidecarRename(nfoPath(stage), nfoPath(dst))
|
||||
moveStagedArtwork(stage, dst)
|
||||
|
||||
Reference in New Issue
Block a user