1
HuBingJie
8 天以前 5da3a276b7847187a7c155ee069d3cd4c9e58074
´úÂë¹ÜÀí/WCS/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/LogJob.cs
@@ -1,7 +1,6 @@
using Quartz;
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using WIDESEA_Common.Log;
@@ -10,10 +9,6 @@
    [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
@@ -22,195 +17,114 @@
                {
                    try
                    {
                            // æ¸…理日志文件
                            CleanLogFilesOnly(LogRootPath, TimeSpan.FromMinutes(43200));
                            CleanAllInPlatformInfo(PlatformInfoPath, TimeSpan.FromMinutes(43200));
                        WriteLog.GetLog("LogJob").Write($"日志记录:{DateTime.Now}", "LogJob");
                            Thread.Sleep(1000 * 10); // 10秒后再次执行
                        // è®¾ç½®ä¿ç•™å¤©æ•°ä¸º30天
                        int saveDays = 30;
                        // æ¸…理Log目录下的所有过期文件夹
                        CleanLogDirectory(saveDays);
                        Thread.Sleep(1000 * 10);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"日志任务执行异常: {ex.Message}");
                        WriteLog.GetLog("LogJob").Write($"日志清理出错:{ex.Message}", "LogJob");
                    }
                });
            }
            catch (Exception ex)
            {
                Console.WriteLine($"{nameof(LogJob)} åˆå§‹åŒ–异常: {ex.Message}");
                Console.Out.WriteLine(nameof(LogJob) + ":" + ex.Message);
            }
            return Task.CompletedTask;
        }
        /// <summary>
        /// æ£€æŸ¥è·¯å¾„是否在允许删除的范围内
        /// æ¸…理Log目录下的所有过期日志文件夹
        /// </summary>
        /// <param name="path">要检查的路径</param>
        /// <param name="allowedRoot">允许的根目录</param>
        /// <returns>是否允许删除</returns>
        private static bool IsPathAllowed(string path, string allowedRoot)
        /// <param name="saveDays">保留天数</param>
        private static void CleanLogDirectory(int saveDays)
        {
            try
            {
                var fullPath = Path.GetFullPath(path);
                return fullPath.StartsWith(allowedRoot, StringComparison.OrdinalIgnoreCase);
            }
            catch
            {
                return false;
            }
        }
            // èŽ·å–Log目录路径
            var logBasePath = Path.Combine(Environment.CurrentDirectory, "Log");
        /// <summary>
        /// åªæ¸…理Log目录下的文件
        /// </summary>
        /// <param name="directoryPath">要清理的目录路径</param>
        /// <param name="maxAge">文件最大保留时间</param>
        private static void CleanLogFilesOnly(string directoryPath, TimeSpan maxAge)
        {
            if (!Directory.Exists(directoryPath))
            if (!Directory.Exists(logBasePath))
            {
                //Console.WriteLine($"目录不存在: {directoryPath}");
                WriteLog.GetLog("LogJob").Write($"Log目录不存在:{logBasePath}", "LogJob");
                return;
            }
            try
            var nowTime = DateTime.Now;
            var cutoffDate = nowTime.AddDays(-saveDays);
            WriteLog.GetLog("LogJob").Write($"开始清理日志,保留天数:{saveDays},截止日期:{cutoffDate:yyyy-MM-dd}", "LogJob");
            // èŽ·å–Log目录下的所有子目录
            var allSubDirs = Directory.GetDirectories(logBasePath, "*", SearchOption.AllDirectories);
            foreach (var dirPath in allSubDirs)
            {
                var now = DateTime.Now;
                // åªèŽ·å–å½“å‰ç›®å½•çš„æ–‡ä»¶ï¼Œä¸åŒ…å«å­ç›®å½•
                var files = Directory.GetFiles(directoryPath, "*", SearchOption.TopDirectoryOnly);
                int deletedCount = 0;
                foreach (var file in files)
                try
                {
                    try
                    {
                        // æ£€æŸ¥æ–‡ä»¶æ˜¯å¦åœ¨å…è®¸åˆ é™¤çš„范围内
                        if (!IsPathAllowed(file, LogRootPath))
                        {
                            Console.WriteLine($"跳过非Log目录文件: {file}");
                            continue;
                        }
                    // èŽ·å–æ–‡ä»¶å¤¹å
                    var dirName = Path.GetFileName(dirPath);
                        // èŽ·å–æ–‡ä»¶åˆ›å»ºæ—¶é—´
                        var creationTime = File.GetCreationTime(file);
                        // æ£€æŸ¥æ–‡ä»¶æ˜¯å¦è¶…过指定时间
                        if (now - creationTime > maxAge)
                        {
                            File.Delete(file);
                            deletedCount++;
                            //Console.WriteLine($"已删除文件: {file}");
                        }
                    }
                    catch (Exception ex)
                    // å°è¯•解析为日期(支持多种格式)
                    if (TryParseDateFolder(dirName, out DateTime folderDate))
                    {
                        Console.WriteLine($"删除文件 {file} æ—¶å‡ºé”™: {ex.Message}");
                        // åˆ¤æ–­æ˜¯å¦è¿‡æœŸ
                        if (folderDate < cutoffDate)
                        {
                            WriteLog.GetLog("LogJob").Write($"删除过期日志文件夹:{dirPath},日期:{folderDate:yyyy-MM-dd}", "LogJob");
                            // é€’归删除文件夹及其内容
                            Directory.Delete(dirPath, true);
                        }
                        else
                        {
                            WriteLog.GetLog("LogJob").Write($"保留日志文件夹:{dirPath},日期:{folderDate:yyyy-MM-dd}", "LogJob");
                        }
                    }
                }
                catch (Exception ex)
                {
                    WriteLog.GetLog("LogJob").Write($"处理文件夹 {dirPath} æ—¶å‡ºé”™ï¼š{ex.Message}", "LogJob");
                }
            }
                //Console.WriteLine($"目录 {directoryPath} æ¸…理完成,删除了 {deletedCount} ä¸ªæ–‡ä»¶");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"清理目录 {directoryPath} æ—¶å‡ºé”™: {ex.Message}");
            }
            WriteLog.GetLog("LogJob").Write($"日志清理完成", "LogJob");
        }
        /// <summary>
        /// æ¸…理站台读取信息记录目录下的所有内容和子目录
        /// å°è¯•解析日期文件夹名称
        /// </summary>
        /// <param name="directoryPath">要清理的目录路径</param>
        /// <param name="maxAge">文件最大保留时间</param>
        private static void CleanAllInPlatformInfo(string directoryPath, TimeSpan maxAge)
        /// <param name="folderName">文件夹名称</param>
        /// <param name="date">解析出的日期</param>
        /// <returns>是否成功解析</returns>
        private static bool TryParseDateFolder(string folderName, out DateTime date)
        {
            if (!Directory.Exists(directoryPath))
            // æ”¯æŒçš„æ—¥æœŸæ ¼å¼
            string[] dateFormats =
            {
                //Console.WriteLine($"目录不存在: {directoryPath}");
                return;
            }
                "yyyy-MM-dd",   // 2025-12-07
                "yyyyMMdd",     // 20251207
                "yyyy_MM_dd",   // 2025_12_07
                "yyyy.MM.dd",   // 2025.12.07
                "yyyyå¹´MM月dd日" // 2025å¹´12月07日
            };
            try
            {
                var now = DateTime.Now;
                int deletedCount = 0;
            // å°è¯•解析日期
            bool success = DateTime.TryParseExact(
                folderName,
                dateFormats,
                System.Globalization.CultureInfo.InvariantCulture,
                System.Globalization.DateTimeStyles.None,
                out date
            );
                // åˆ é™¤æ‰€æœ‰è¿‡æœŸçš„æ–‡ä»¶
                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}");
            }
        }
        /// <summary>
        /// é€’归删除所有空子目录
        /// </summary>
        /// <param name="directoryPath">要清理的目录路径</param>
        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}");
            }
            return success;
        }
    }
}