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
|
{
|
/// <summary>
|
/// 当前路径
|
/// </summary>
|
public string dirPath { get; set; }
|
|
/// <summary>
|
/// 当前名称
|
/// </summary>
|
public string dirName { get; set; }
|
|
/// <summary>
|
/// 子文件
|
/// </summary>
|
public List<FileDataInfo> files { get; set; }
|
|
/// <summary>
|
/// 子文件夹
|
/// </summary>
|
public List<DirInfo> dirs { get; set; }
|
}
|
|
public class FileDataInfo
|
{
|
public string filePath { get; set; }
|
|
public string fileName { get; set; }
|
|
public long fileSize { get; set; }
|
}
|
|
public class GetLogParm
|
{
|
/// <summary>
|
/// 文件地址
|
/// </summary>
|
public string path;
|
|
/// <summary>
|
/// 读取进度
|
/// </summary>
|
public float percent;
|
|
/// <summary>
|
/// 最大读取大小
|
/// </summary>
|
public double maxsize_KB = 20;
|
|
/// <summary>
|
/// 当前起始位置
|
/// </summary>
|
public long topStartPos = 0;
|
}
|
#endregion
|
public interface ISys_LogService : IService<Sys_Log>
|
{
|
/// <summary>
|
/// 递归获取文件信息
|
/// </summary>
|
/// <param name="dirPath"></param>
|
/// <returns></returns>
|
private DirInfo GetDirInfo(string dirPath)
|
{
|
//当前文件夹
|
var dirInfo = new DirInfo();
|
dirInfo.dirName = Path.GetFileName(dirPath);
|
|
//子文件
|
List<FileDataInfo> files = new List<FileDataInfo>();
|
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<DirInfo>();
|
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;
|
}
|
|
/// <summary>
|
/// 获取日志文件列表
|
/// </summary>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 获取文件内容
|
/// </summary>
|
/// <param name="parm"></param>
|
/// <returns></returns>
|
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 });
|
}
|
|
}
|
}
|