using Ips.Library.Basic; using Microsoft.Extensions.Hosting; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ips.Library.WebApi { /// /// 基础清理服务(负责upload目录的清理) /// public class BaseClearService : BackgroundService { private readonly string dir = "upload"; /// /// /// /// /// protected override async Task ExecuteAsync(CancellationToken stoppingToken) { await Task.Delay(5000, stoppingToken);//延迟一会儿让webbapi先启动 IpsLogger.Info($"启动通用目录{dir}数据清理功能..."); await Task.Run(async () => { while (!stoppingToken.IsCancellationRequested) { Clear(); //5分钟扫描一次 await Task.Delay(600 * 1000, stoppingToken); } //程序退出时强制删除所有 try { Directory.Delete(dir, true); } catch { } }, stoppingToken); } private void Clear() { #region 清理空目录 string clearDir = Path.Combine(AppContext.BaseDirectory, dir); try { var dirs = Directory.EnumerateDirectories(clearDir, "*", SearchOption.AllDirectories); foreach (var item in dirs) { DirectoryInfo dir = new DirectoryInfo(item); if (dir.EnumerateFiles().Any()) continue; //删除5分钟以前创建的空目录 if ((DateTime.Now - dir.CreationTime).TotalMinutes > 5) { dir.Delete(); } } } catch (Exception ex) { IpsLogger.Error($"删除{dir}目录中的空目录出错", ex); } #endregion #region 清理30分钟以前上传的文件 var files = Directory.EnumerateFiles(clearDir, "*", SearchOption.AllDirectories); foreach (var item in files) { FileInfo f = new FileInfo(item); if ((DateTime.Now - f.LastWriteTime).TotalMinutes > 30) { try { f.Delete(); } catch (Exception ex) { IpsLogger.Error($"$删除{dir}目录中文件[{f.Name}]失败", ex); } } } #endregion } } }