huanghongfeng
7 小时以前 6ba24a49c009cca01d9c02b9dae692a53b8be116
´úÂë¹ÜÀí/WCS/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/LogJob.cs
@@ -1,216 +1,123 @@
using Quartz;
using HslCommunication;
using HslCommunication.Core;
using Microsoft.AspNetCore.Http;
using Microsoft.VisualBasic.FileIO;
using Newtonsoft.Json;
using Quartz;
using SixLabors.ImageSharp.PixelFormats;
using System;
using System.IO;
using System.Threading;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Reflection.Metadata.Ecma335;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.Log;
using WIDESEAWCS_Communicator;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DeviceBase;
using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
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秒后再次执行
                        WriteLog.GetLog("LogJob").Write($"日志记录:{DateTime.Now}", "LogJob");
                        Run(10);
                        Run2(10);
                        Thread.Sleep(1000 * 10);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"日志任务执行异常: {ex.Message}");
                    }
                    catch { }
                });
            }
            catch (Exception ex)
            {
                Console.WriteLine($"{nameof(LogJob)} åˆå§‹åŒ–异常: {ex.Message}");
                Console.Out.WriteLine(nameof(LogJob) + ":" + ex.Message);
            }
            return Task.CompletedTask;
        }
        /// <summary>
        /// æ£€æŸ¥è·¯å¾„是否在允许删除的范围内
        /// </summary>
        /// <param name="path">要检查的路径</param>
        /// <param name="allowedRoot">允许的根目录</param>
        /// <returns>是否允许删除</returns>
        private static bool IsPathAllowed(string path, string allowedRoot)
        private static void Run(int saveDays)
        {
            try
            var logPath = System.Environment.CurrentDirectory + "/log";
            if (Directory.Exists(logPath))
            {
                var fullPath = Path.GetFullPath(path);
                return fullPath.StartsWith(allowedRoot, StringComparison.OrdinalIgnoreCase);
            }
            catch
            {
                return false;
            }
        }
                var nowTime = DateTime.Now;
                var dayDir = Directory.GetDirectories(logPath, "20*", System.IO.SearchOption.AllDirectories);
        /// <summary>
        /// åªæ¸…理Log目录下的文件
        /// </summary>
        /// <param name="directoryPath">要清理的目录路径</param>
        /// <param name="maxAge">文件最大保留时间</param>
        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)
                foreach (var dirpath in dayDir)
                {
                    try
                    //文件夹名
                    var dirName = Path.GetFileName(dirpath).Replace("_", "-");
                    DateTime targetDate = DateTime.ParseExact(dirName, "yyyyMMdd", null);
                    if ((nowTime - targetDate).TotalDays >= saveDays)
                    {
                        // æ£€æŸ¥æ–‡ä»¶æ˜¯å¦åœ¨å…è®¸åˆ é™¤çš„范围内
                        if (!IsPathAllowed(file, LogRootPath))
                        //删除文件和文件夹
                        try
                        {
                            Console.WriteLine($"跳过非Log目录文件: {file}");
                            continue;
                            var flies = Directory.GetFiles(dirpath);
                            foreach (var item in flies)
                            {
                                File.Delete(item);
                            }
                            Directory.Delete(dirpath);
                        }
                        // èŽ·å–æ–‡ä»¶åˆ›å»ºæ—¶é—´
                        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}");
            }
        }
        /// <summary>
        /// æ¸…理站台读取信息记录目录下的所有内容和子目录
        /// </summary>
        /// <param name="directoryPath">要清理的目录路径</param>
        /// <param name="maxAge">文件最大保留时间</param>
        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}");
            }
        }
        /// <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 { }
                    }
                }
            }
            catch (Exception ex)
        }
        private static void Run2(int saveDays)
        {
            var logPath = System.Environment.CurrentDirectory + "/txt";
            if (Directory.Exists(logPath))
            {
                Console.WriteLine($"处理目录 {directoryPath} æ—¶å‡ºé”™: {ex.Message}");
                var nowTime = DateTime.Now;
                var dayDir = Directory.GetDirectories(logPath, "20*", System.IO.SearchOption.AllDirectories);
                foreach (var dirpath in dayDir)
                {
                    //文件夹名
                    var dirName = Path.GetFileName(dirpath).Replace("_", "-");
                    DateTime targetDate = DateTime.ParseExact(dirName, "yyyyMMdd", null);
                    if ((nowTime - targetDate).TotalDays >= saveDays)
                    {
                        //删除文件和文件夹
                        try
                        {
                            var flies = Directory.GetFiles(dirpath);
                            foreach (var item in flies)
                            {
                                File.Delete(item);
                            }
                            Directory.Delete(dirpath);
                        }
                        catch { }
                    }
                }
            }
        }
    }
}
}