Files
XplorePlane/XP.Common/Dump/Implementations/DumpCleaner.cs
T

70 lines
2.7 KiB
C#

using System;
using System.IO;
using System.Linq;
using XP.Common.Dump.Configs;
using XP.Common.Logging.Interfaces;
namespace XP.Common.Dump.Implementations
{
/// <summary>
/// Dump 文件自动清理组件,按保留天数策略删除过期文件
/// Auto cleanup component for dump files, deletes expired files based on retention policy
/// </summary>
internal class DumpCleaner
{
private readonly DumpConfig _config;
private readonly ILoggerService _logger;
public DumpCleaner(DumpConfig config, ILoggerService logger)
{
_config = config ?? throw new ArgumentNullException(nameof(config));
_logger = logger?.ForModule<DumpCleaner>() ?? throw new ArgumentNullException(nameof(logger));
}
/// <summary>
/// 执行清理操作:删除超过保留天数的 .dmp 文件
/// Execute cleanup: delete .dmp files older than retention days
/// </summary>
public void CleanExpiredFiles()
{
try
{
if (!Directory.Exists(_config.StoragePath))
{
_logger.Debug("存储目录不存在,跳过清理:{Path} | Storage directory does not exist, skipping cleanup: {Path}", _config.StoragePath);
return;
}
var dmpFiles = Directory.GetFiles(_config.StoragePath, "*.dmp");
var cutoffTime = DateTime.Now.AddDays(-_config.RetentionDays);
var deletedCount = 0;
foreach (var filePath in dmpFiles)
{
try
{
var creationTime = File.GetCreationTime(filePath);
if (creationTime < cutoffTime)
{
var fileName = Path.GetFileName(filePath);
File.Delete(filePath);
deletedCount++;
_logger.Info("已删除过期 Dump 文件:{FileName} | Deleted expired dump file: {FileName}", fileName);
}
}
catch (Exception ex)
{
_logger.Error(ex, "删除 Dump 文件失败:{FilePath} | Failed to delete dump file: {FilePath}", filePath);
}
}
_logger.Info("Dump 清理完成,共删除 {Count} 个文件 | Dump cleanup completed, {Count} files deleted", deletedCount);
}
catch (Exception ex)
{
_logger.Error(ex, "Dump 清理过程发生异常:{Message} | Dump cleanup error: {Message}", ex.Message);
}
}
}
}