using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Core; using WIDESEAWCS_Core.BaseServices; using WIDESEAWCS_Model.Models; namespace WIDESEAWCS_ISystemServices { #region 实体类 public class DirInfo { /// /// 当前路径 /// public string dirPath { get; set; } /// /// 当前名称 /// public string dirName { get; set; } /// /// 子文件 /// public List files { get; set; } /// /// 子文件夹 /// public List dirs { get; set; } } public class FileDataInfo { public string filePath { get; set; } public string fileName { get; set; } public long fileSize { get; set; } } public class GetLogParm { /// /// 文件地址 /// public string path; /// /// 读取进度 /// public float percent; /// /// 最大读取大小 /// public double maxsize_KB = 20; /// /// 当前起始位置 /// public long topStartPos = 0; } #endregion public interface ISys_LogService : IService { /// /// 递归获取文件信息 /// /// /// private DirInfo GetDirInfo(string dirPath) { //当前文件夹 var dirInfo = new DirInfo(); dirInfo.dirName = Path.GetFileName(dirPath); //子文件 List files = new List(); foreach (var file in Directory.GetFiles(dirPath)) { files.Add(new FileDataInfo() { filePath = file, fileName = Path.GetFileName(file) }); } //子文件夹 var dirs = Directory.GetDirectories(dirPath); dirInfo.dirs = new List(); foreach (var dir in dirs) { dirInfo.dirs.Add(GetDirInfo(dir)); } //子文件夹,与子目录合并 foreach (var file in files) { dirInfo.dirs.Add(new DirInfo() { dirPath = file.filePath, dirName = file.fileName }); } return dirInfo; } /// /// 获取日志文件列表 /// /// public WebResponseContent GetLogList() { WebResponseContent content = new WebResponseContent(); string path = System.Environment.CurrentDirectory + "/log"; if (!System.IO.Directory.Exists(path)) { return content.Error("暂无日志文件"); } content.Data = GetDirInfo(path); content.OK(); return content; } /// /// 获取文件内容 /// /// /// public WebResponseContent GetLogData(GetLogParm parm) { WebResponseContent content = new WebResponseContent(); string res = ""; //是否读取到最后 bool isEnd = false; long startIndex = 0; //文件大小 long len = 0; try { if (!System.IO.File.Exists(parm.path)) { throw new Exception($"文件{parm.path}不存在!"); } using (FileStream fs = new FileStream(parm.path, FileMode.Open, FileAccess.Read, FileShare.Read)) { //最大读取大小 int maxsize = (int)(1024 * parm.maxsize_KB); len = fs.Length; long startPos = (long)(len * (parm.percent / 100));//起始位置 long readLen = len - startPos;//读取长度 //向前加载 if (parm.topStartPos != 0) { startPos = parm.topStartPos - maxsize; if (startPos < 0) { //已读到起始位 startPos = 0; readLen = parm.topStartPos; } else { readLen = maxsize; } } else { //读取大小是否超出最大长度 if (readLen > maxsize) { readLen = maxsize; } else { isEnd = true; } } //加载100%,按最大内容读取 if (parm.percent == 100) { if (len < maxsize) { startPos = 0; readLen = len; } else { startPos = len - maxsize; readLen = maxsize; } } fs.Seek(startPos, SeekOrigin.Begin); var buffer = new byte[readLen]; fs.Read(buffer, 0, (int)readLen); startIndex = startPos; if (startPos != 0 && (parm.percent != 0 || parm.topStartPos != 0)) { //不是从头加载,删除可能不完整的第一行 int skipCount = 0; for (int i = 0; i < buffer.Length; i++) { if (buffer[i] == 10) { skipCount = i; break; } } if (skipCount != 0) { //去掉换行 skipCount++; //下次读取前延 startIndex += skipCount; } res = Encoding.UTF8.GetString(buffer.Skip(skipCount).ToArray()); } else { res = Encoding.UTF8.GetString(buffer); } } } catch (Exception ex) { return content.Error(ex.Message); } return content.OK(data: new { content = res, isEnd, startIndex, len }); } } }