重构: App拆分10域文件+并发安全+结构化日志+依赖升级
This commit is contained in:
@@ -20,8 +20,8 @@ func NewFileLockChecker() *FileLockChecker {
|
||||
// IsFileLocked 检查文件是否被锁定(被其他进程占用)
|
||||
// 返回: (是否锁定, 错误信息, 错误)
|
||||
func (c *FileLockChecker) IsFileLocked(path string) (bool, string, error) {
|
||||
// 尝试以独占写模式打开文件
|
||||
file, err := os.OpenFile(path, os.O_RDWR|syscall.O_CREAT, 0666)
|
||||
// 尝试以独占写模式打开文件(不创建新文件)
|
||||
file, err := os.OpenFile(path, os.O_RDWR, 0)
|
||||
if err != nil {
|
||||
// 检查是否是锁相关的错误
|
||||
if isLockError(err) {
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"math/big"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -23,9 +24,10 @@ type RecycleBinEntry struct {
|
||||
|
||||
// RecycleBin 回收站管理器
|
||||
type RecycleBin struct {
|
||||
binPath string
|
||||
mu sync.Mutex
|
||||
binPath string
|
||||
metadataFile string
|
||||
entries []RecycleBinEntry
|
||||
entries []RecycleBinEntry
|
||||
}
|
||||
|
||||
// NewRecycleBin 创建回收站管理器
|
||||
@@ -57,6 +59,8 @@ func NewRecycleBin(binPath string) (*RecycleBin, error) {
|
||||
|
||||
// MoveToRecycleBin 移动文件到回收站
|
||||
func (rb *RecycleBin) MoveToRecycleBin(path string) error {
|
||||
rb.mu.Lock()
|
||||
defer rb.mu.Unlock()
|
||||
// 获取文件信息
|
||||
info, err := os.Stat(path)
|
||||
if err != nil {
|
||||
@@ -111,6 +115,8 @@ func (rb *RecycleBin) MoveToRecycleBin(path string) error {
|
||||
|
||||
// RestoreFromRecycleBin 从回收站恢复文件
|
||||
func (rb *RecycleBin) RestoreFromRecycleBin(recyclePath string) error {
|
||||
rb.mu.Lock()
|
||||
defer rb.mu.Unlock()
|
||||
// 查找对应的元数据条目
|
||||
var entry *RecycleBinEntry
|
||||
for i := range rb.entries {
|
||||
@@ -156,6 +162,8 @@ func (rb *RecycleBin) RestoreFromRecycleBin(recyclePath string) error {
|
||||
|
||||
// DeletePermanently 永久删除回收站中的文件
|
||||
func (rb *RecycleBin) DeletePermanently(recyclePath string) error {
|
||||
rb.mu.Lock()
|
||||
defer rb.mu.Unlock()
|
||||
// 查找元数据条目
|
||||
for i, entry := range rb.entries {
|
||||
if entry.DeletedPath == recyclePath {
|
||||
@@ -180,11 +188,15 @@ func (rb *RecycleBin) DeletePermanently(recyclePath string) error {
|
||||
|
||||
// ListEntries 列出回收站中的所有条目
|
||||
func (rb *RecycleBin) ListEntries() []RecycleBinEntry {
|
||||
return rb.entries
|
||||
rb.mu.Lock()
|
||||
defer rb.mu.Unlock()
|
||||
return append([]RecycleBinEntry(nil), rb.entries...)
|
||||
}
|
||||
|
||||
// Empty 清空回收站
|
||||
func (rb *RecycleBin) Empty() error {
|
||||
rb.mu.Lock()
|
||||
defer rb.mu.Unlock()
|
||||
// 删除所有文件
|
||||
for _, entry := range rb.entries {
|
||||
if err := os.RemoveAll(entry.DeletedPath); err != nil {
|
||||
@@ -215,6 +227,8 @@ func (rb *RecycleBin) autoCleanup() {
|
||||
|
||||
// cleanupExpiredEntries 清理过期的条目
|
||||
func (rb *RecycleBin) cleanupExpiredEntries() {
|
||||
rb.mu.Lock()
|
||||
defer rb.mu.Unlock()
|
||||
now := time.Now()
|
||||
expiredEntries := make([]int, 0)
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
"encoding/base64"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
@@ -248,7 +249,7 @@ func (s *FileSystemService) DeletePathWithContext(ctx context.Context, path stri
|
||||
if !isInRecycleBin(path) {
|
||||
if err := s.recycleBin.MoveToRecycleBin(path); err != nil {
|
||||
// 回收站失败,记录但继续
|
||||
fmt.Printf("[警告] 移动到回收站失败: %v\n", err)
|
||||
slog.Warn("移动到回收站失败", "error", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -617,13 +617,18 @@ func (s *Service) RenamePath(connID string, oldPath string, newPath string) (*fi
|
||||
if err := c.Copy(ctx, f.Key, newPrefix+relativeKey); err != nil {
|
||||
return nil, fmt.Errorf("复制失败: %w", err)
|
||||
}
|
||||
c.Delete(ctx, f.Key)
|
||||
if err := c.Delete(ctx, f.Key); err != nil {
|
||||
return nil, fmt.Errorf("删除源文件失败: %w", err)
|
||||
}
|
||||
}
|
||||
if !listResult.IsTruncated {
|
||||
break
|
||||
}
|
||||
}
|
||||
c.Delete(ctx, oldKey) // marker
|
||||
if err := c.Delete(ctx, oldKey); err != nil { // marker
|
||||
// 目录标记删除失败不影响重命名结果
|
||||
_ = err
|
||||
}
|
||||
} else {
|
||||
if err := c.Copy(ctx, oldKey, newKey); err != nil {
|
||||
return nil, fmt.Errorf("复制失败: %w", err)
|
||||
|
||||
@@ -3,6 +3,7 @@ package storage
|
||||
import (
|
||||
"crypto/sha256"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"time"
|
||||
@@ -94,7 +95,7 @@ func CleanupExpiredCache() {
|
||||
}
|
||||
|
||||
if len(expired) > 0 {
|
||||
fmt.Printf("[下载缓存] 清理 %d 条过期记录\n", len(expired))
|
||||
slog.Info("清理过期下载缓存", "count", len(expired))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user