123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- 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
- {
- /// <summary>
- /// 磁盘可用空间百分比不足此数时开始清理数据
- /// </summary>
- float maxPercent = 0.2f;//
- /// <summary>
- /// 被监控目录
- /// </summary>
- string[] monitorPaths;
- /// <summary>
- /// 是否监控
- /// </summary>
- 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);
- }
- }
- }
- }
|