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 });
}
}
}