using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;
using Ips.Library.Basic;
using DevExpress.PerformanceTests.PerfomanceMonitor;
namespace Ips.Service.CapServer
{
class FileMonitor
{
///
/// 磁盘可用空间百分比不足此数时开始清理数据
///
float maxPercent = 0.2f;//
///
/// 被监控目录
///
string[] monitorPaths;
///
/// 是否监控
///
volatile bool isMonitor = false;
public FileMonitor(string[] p, float maxPercent = 0.2f)
{
this.monitorPaths = p.Select(p => p.ToUpper()).Distinct().ToArray();
this.maxPercent = maxPercent;
}
public void Stop()
{
isMonitor = false;
}
public void Start()
{
isMonitor = true;
_ = DoMonitor();
}
private async Task DoMonitor()
{
while (isMonitor)
{
CheckAndClearDisk();
await Task.Delay(1000 * 300);
}
}
private void CheckAndClearDisk()
{
try
{
var driveFolders = monitorPaths.GroupBy(m => Path.GetPathRoot(m));
foreach (var driveFolder in driveFolders)
{
DriveInfo drive = new DriveInfo(driveFolder.Key);
DateTime prevClearTime = DateTime.MinValue;
while (drive.TotalFreeSpace / (drive.TotalSize * 1.0f) <= maxPercent)
{
IpsLogger.Info($"正在清理[{string.Join(";",driveFolder.ToList())}]中的数据...");
var fsList = driveFolder.Where(m => Directory.Exists(m))
.Select(m => new DirectoryInfo(m))
.SelectMany(m => m.EnumerateFiles("*", SearchOption.AllDirectories));
if (!fsList.Any())
{
IpsLogger.Warn($"{drive.ToString().Substring(0, 1)}盘空间不足,但要清理数据的目录为空,清理数据结束!");
Thread.Sleep(100);
}
else
{
//每次清理从上次清理结束时间开始,防止有些删不掉的文件阻止删除文件
var firstFs = fsList.Where(m => m.LastWriteTime > prevClearTime).OrderBy(m => m.LastWriteTime).FirstOrDefault();
var clearTime = firstFs.LastWriteTime.AddHours(1);
foreach (var fsItem in fsList.Where(m => m.LastWriteTime <= clearTime))
{
try
{
fsItem.Delete();
if (!fsItem.Directory.EnumerateFiles("*", SearchOption.AllDirectories).Any())
{
bool isAny = driveFolder.Any(s => s.Contains(fsItem.DirectoryName));
if (isAny) continue;
fsItem.Directory.Delete(true);
}
}
catch (Exception ex)
{
IpsLogger.Error($"{DateTime.Now:yyyy-MM-dd HH:mm:ss} 删除文件或目录出错", ex);
}
}
prevClearTime = clearTime;
IpsLogger.Info($"{DateTime.Now:yyyy-MM-dd HH:mm:ss} 清理数据结束!");
}
}
}
}
catch (Exception ex)
{
IpsLogger.Error($"清理数据异常", ex);
}
}
}
}