1
HuBingJie
5 天以前 7ac6ad15e5af1024f4d21d33bb3af98ffce43874
´úÂë¹ÜÀí/WCS/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/LogJob.cs
@@ -1,75 +1,216 @@
using HslCommunication;
using HslCommunication.Core;
using HslCommunication.WebSocket;
using Microsoft.AspNetCore.Http;
using Microsoft.VisualBasic.FileIO;
using Newtonsoft.Json;
using Quartz;
using Quartz.Util;
using SixLabors.ImageSharp.PixelFormats;
using Quartz;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Reflection.Metadata.Ecma335;
using System.Text;
using System.IO;
using System.Threading;
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
    {
        static object sendData = null;
        // å®šä¹‰å…è®¸åˆ é™¤çš„æ ¹ç›®å½•
        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
                    {
                        while (true)
                        {
                            Run(5);
                        }
                    }
                    catch { }
                });
                            // æ¸…理日志文件
                            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.Out.WriteLine(nameof(LogJob) + ":" + ex.Message);
                Console.WriteLine($"{nameof(LogJob)} åˆå§‹åŒ–异常: {ex.Message}");
            }
            return Task.CompletedTask;
        }
        private static void Run(int saveDays)
        /// <summary>
        /// æ£€æŸ¥è·¯å¾„是否在允许删除的范围内
        /// </summary>
        /// <param name="path">要检查的路径</param>
        /// <param name="allowedRoot">允许的根目录</param>
        /// <returns>是否允许删除</returns>
        private static bool IsPathAllowed(string path, string allowedRoot)
        {
            sendData = new { code = "1002", Messagest = $"车轮SN号:123123123" };
            CacheData.WebSocket.PublishAllClientPayload(sendData.Serialize());
            try
            {
                var fullPath = Path.GetFullPath(path);
                return fullPath.StartsWith(allowedRoot, StringComparison.OrdinalIgnoreCase);
            }
            catch
            {
                return false;
            }
        }
        public class CacheData
        /// <summary>
        /// åªæ¸…理Log目录下的文件
        /// </summary>
        /// <param name="directoryPath">要清理的目录路径</param>
        /// <param name="maxAge">文件最大保留时间</param>
        private static void CleanLogFilesOnly(string directoryPath, TimeSpan maxAge)
        {
            public static WebSocketServer WebSocket = new WebSocketServer();
            public static void StartServer()
            if (!Directory.Exists(directoryPath))
            {
                WebSocket = new WebSocketServer();
                WebSocket.ServerStart(1880);
                //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}");
            }
        }
        /// <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 (Exception ex)
            {
                Console.WriteLine($"处理目录 {directoryPath} æ—¶å‡ºé”™: {ex.Message}");
            }
        }
    }
}
}