package component_report import ( "fmt" "os" "path/filepath" "time" "go.uber.org/zap" ) // CacheManager 缓存管理器 type CacheManager struct { cacheDir string ttl time.Duration logger *zap.Logger } // NewCacheManager 创建缓存管理器 func NewCacheManager(cacheDir string, ttl time.Duration, logger *zap.Logger) *CacheManager { return &CacheManager{ cacheDir: cacheDir, ttl: ttl, logger: logger, } } // CleanExpiredCache 清理过期缓存 func (cm *CacheManager) CleanExpiredCache() error { // 确保缓存目录存在 if _, err := os.Stat(cm.cacheDir); os.IsNotExist(err) { return nil // 目录不存在,无需清理 } // 遍历缓存目录 err := filepath.Walk(cm.cacheDir, func(path string, info os.FileInfo, err error) error { if err != nil { return err } // 跳过目录 if info.IsDir() { return nil } // 检查文件是否过期 if time.Since(info.ModTime()) > cm.ttl { // cm.logger.Debug("删除过期缓存文件", // zap.String("path", path), // zap.Time("mod_time", info.ModTime()), // zap.Duration("age", time.Since(info.ModTime()))) if err := os.Remove(path); err != nil { cm.logger.Error("删除过期缓存文件失败", zap.Error(err), zap.String("path", path)) return err } } return nil }) if err != nil { return fmt.Errorf("清理过期缓存失败: %w", err) } // cm.logger.Info("缓存清理完成", zap.String("cache_dir", cm.cacheDir)) return nil } // GetCacheSize 获取缓存总大小 func (cm *CacheManager) GetCacheSize() (int64, error) { var totalSize int64 err := filepath.Walk(cm.cacheDir, func(path string, info os.FileInfo, err error) error { if err != nil { return err } if !info.IsDir() { totalSize += info.Size() } return nil }) if err != nil { return 0, fmt.Errorf("计算缓存大小失败: %w", err) } return totalSize, nil } // GetCacheCount 获取缓存文件数量 func (cm *CacheManager) GetCacheCount() (int, error) { var count int err := filepath.Walk(cm.cacheDir, func(path string, info os.FileInfo, err error) error { if err != nil { return err } if !info.IsDir() { count++ } return nil }) if err != nil { return 0, fmt.Errorf("统计缓存文件数量失败: %w", err) } return count, nil } // ClearAllCache 清理所有缓存 func (cm *CacheManager) ClearAllCache() error { // 确保缓存目录存在 if _, err := os.Stat(cm.cacheDir); os.IsNotExist(err) { return nil // 目录不存在,无需清理 } err := os.RemoveAll(cm.cacheDir) if err != nil { return fmt.Errorf("清理所有缓存失败: %w", err) } // 重新创建目录 if err := os.MkdirAll(cm.cacheDir, 0755); err != nil { return fmt.Errorf("重新创建缓存目录失败: %w", err) } // cm.logger.Info("所有缓存已清理", zap.String("cache_dir", cm.cacheDir)) return nil }