using Quartz;
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using WIDESEA_Common.Log;
namespace WIDESEAWCS_Tasks
{
[DisallowConcurrentExecution]
public class LogJob : IJob
{
// 定义允许删除的根目录
private static readonly string LogRootPath = Path.GetFullPath(Environment.CurrentDirectory + "/Log");
private static readonly string PlatformInfoPath = Path.GetFullPath(Environment.CurrentDirectory + "/Log/站台读取信息记录");
public Task Execute(IJobExecutionContext context)
{
try
{
Task.Run(() =>
{
try
{
// 清理日志文件
CleanLogFilesOnly(LogRootPath, TimeSpan.FromMinutes(43200));
CleanAllInPlatformInfo(PlatformInfoPath, TimeSpan.FromMinutes(43200));
Thread.Sleep(1000 * 10); // 10秒后再次执行
}
catch (Exception ex)
{
Console.WriteLine($"日志任务执行异常: {ex.Message}");
}
});
}
catch (Exception ex)
{
Console.WriteLine($"{nameof(LogJob)} 初始化异常: {ex.Message}");
}
return Task.CompletedTask;
}
///
/// 检查路径是否在允许删除的范围内
///
/// 要检查的路径
/// 允许的根目录
/// 是否允许删除
private static bool IsPathAllowed(string path, string allowedRoot)
{
try
{
var fullPath = Path.GetFullPath(path);
return fullPath.StartsWith(allowedRoot, StringComparison.OrdinalIgnoreCase);
}
catch
{
return false;
}
}
///
/// 只清理Log目录下的文件
///
/// 要清理的目录路径
/// 文件最大保留时间
private static void CleanLogFilesOnly(string directoryPath, TimeSpan maxAge)
{
if (!Directory.Exists(directoryPath))
{
//Console.WriteLine($"目录不存在: {directoryPath}");
return;
}
try
{
var now = DateTime.Now;
// 只获取当前目录的文件,不包含子目录
var files = Directory.GetFiles(directoryPath, "*", SearchOption.TopDirectoryOnly);
int deletedCount = 0;
foreach (var file in files)
{
try
{
// 检查文件是否在允许删除的范围内
if (!IsPathAllowed(file, LogRootPath))
{
Console.WriteLine($"跳过非Log目录文件: {file}");
continue;
}
// 获取文件创建时间
var creationTime = File.GetCreationTime(file);
// 检查文件是否超过指定时间
if (now - creationTime > maxAge)
{
File.Delete(file);
deletedCount++;
//Console.WriteLine($"已删除文件: {file}");
}
}
catch (Exception ex)
{
Console.WriteLine($"删除文件 {file} 时出错: {ex.Message}");
}
}
//Console.WriteLine($"目录 {directoryPath} 清理完成,删除了 {deletedCount} 个文件");
}
catch (Exception ex)
{
Console.WriteLine($"清理目录 {directoryPath} 时出错: {ex.Message}");
}
}
///
/// 清理站台读取信息记录目录下的所有内容和子目录
///
/// 要清理的目录路径
/// 文件最大保留时间
private static void CleanAllInPlatformInfo(string directoryPath, TimeSpan maxAge)
{
if (!Directory.Exists(directoryPath))
{
//Console.WriteLine($"目录不存在: {directoryPath}");
return;
}
try
{
var now = DateTime.Now;
int deletedCount = 0;
// 删除所有过期的文件
var files = Directory.GetFiles(directoryPath, "*", SearchOption.AllDirectories);
foreach (var file in files)
{
try
{
// 检查文件是否在允许删除的范围内
if (!IsPathAllowed(file, PlatformInfoPath))
{
Console.WriteLine($"跳过非站台信息目录文件: {file}");
continue;
}
var creationTime = File.GetCreationTime(file);
if (now - creationTime > maxAge)
{
File.Delete(file);
deletedCount++;
//Console.WriteLine($"已删除文件: {file}");
}
}
catch (Exception ex)
{
Console.WriteLine($"删除文件 {file} 时出错: {ex.Message}");
}
}
// 删除所有空目录(包括子目录)
DeleteAllEmptySubdirectories(directoryPath);
//Console.WriteLine($"目录 {directoryPath} 清理完成,删除了 {deletedCount} 个文件");
}
catch (Exception ex)
{
Console.WriteLine($"清理目录 {directoryPath} 时出错: {ex.Message}");
}
}
///
/// 递归删除所有空子目录
///
/// 要清理的目录路径
private static void DeleteAllEmptySubdirectories(string directoryPath)
{
if (!Directory.Exists(directoryPath))
return;
try
{
// 递归处理所有子目录
foreach (var subDirectory in Directory.GetDirectories(directoryPath))
{
// 检查目录是否在允许删除的范围内
if (!IsPathAllowed(subDirectory, PlatformInfoPath))
{
Console.WriteLine($"跳过非站台信息目录: {subDirectory}");
continue;
}
DeleteAllEmptySubdirectories(subDirectory);
// 检查子目录是否为空
var files = Directory.GetFiles(subDirectory);
var directories = Directory.GetDirectories(subDirectory);
if (files.Length == 0 && directories.Length == 0)
{
Directory.Delete(subDirectory);
//Console.WriteLine($"已删除空目录: {subDirectory}");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"处理目录 {directoryPath} 时出错: {ex.Message}");
}
}
}
}