using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Core; using WIDESEA_Core.BaseServices; using WIDESEAWCS_IRepository; using WIDESEAWCS_ISystemServices; using WIDESEAWCS_Model.Models; namespace WIDESEAWCS_SystemServices { public class Sys_LogService : ServiceBase, ISys_LogService { public Sys_LogService(ISys_LogRepository BaseDal) : base(BaseDal) { } public WebResponseContent GetLogName() { WebResponseContent content = new WebResponseContent(); try { List data = new List(); DirectoryInfo folder = new DirectoryInfo(AppContext.BaseDirectory + "\\Logs\\"); DirectoryInfo[] firstDirectoryInfos = folder.GetDirectories().OrderByDescending(x => x.CreationTime).ToArray(); int k = 2020; for (int i = 0; i < firstDirectoryInfos.Length; i++) { if (firstDirectoryInfos[i].Name != "Info") { FileInfo[] nextFileInfos = firstDirectoryInfos[i].GetFiles(); List values = new List(); for (int j = 0; j < nextFileInfos.Length; j++) { values.Add(new { label = nextFileInfos[j].Name, id = k, hidden = true, fatherNode = firstDirectoryInfos[i].Name }); k++; } data.Add(new { label = firstDirectoryInfos[i].Name, children = values, id = i, hidden = false }); } } FileInfo[] nextFileInfo = folder.GetFiles(); List value = new List(); for (int j = 0; j < nextFileInfo.Length; j++) { value.Add(new { label = nextFileInfo[j].Name, id = k, hidden = true, fatherNode = folder.Name }); k++; } data.Add(new { label = folder.Name, children = value, id = 1, hidden = false }); return WebResponseContent.Instance.OK(data: data); } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent GetLog(string fileName) { WebResponseContent content = new WebResponseContent(); try { List files = new List(); DirectoryInfo folder = new DirectoryInfo(AppContext.BaseDirectory + "\\Logs\\"); DirectoryInfo[] firstDirectoryInfos = folder.GetDirectories(); for (int i = 0; i < firstDirectoryInfos.Length; i++) { FileInfo[] nextFileInfos = firstDirectoryInfos[i].GetFiles(); files.AddRange(nextFileInfos); } FileInfo[] nextFileInfo = folder.GetFiles(); files.AddRange(nextFileInfo); if (files.Count > 0) { FileInfo file = files.Where(x => x.Name == fileName).FirstOrDefault(); if (file == null) { return WebResponseContent.Instance.Error($"未找到日志文件: {fileName}"); } // 使用共享读取模式 using (FileStream stream = new FileStream( file.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) { StringBuilder text = new StringBuilder(); List lines = new List(); while (!reader.EndOfStream) { var line = reader.ReadLine(); lines.Add(line); } content = WebResponseContent.Instance.OK(data: lines); } } else { content = WebResponseContent.Instance.Error($"未找到日志文件,【{fileName}】"); } } catch (IOException ex) { if (IsFileLockedException(ex)) { content = WebResponseContent.Instance.Error($"日志文件正在被系统写入,请稍后再试"); } else { content = WebResponseContent.Instance.Error($"打开日志文件错误,{ex.Message}"); } } catch (Exception ex) { content = WebResponseContent.Instance.Error($"打开日志文件错误,{ex.Message}"); } return content; } private bool IsFileLockedException(IOException ex) { int errorCode = ex.HResult & 0xFFFF; return errorCode == 32 || errorCode == 33; // ERROR_SHARING_VIOLATION or ERROR_LOCK_VIOLATION } } }