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