using Microsoft.Extensions.Hosting; using Serilog; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DW5S.WebApi { /// /// 基础清理服务(负责upload目录的清理,不会清理NotClear目录及其文件) /// public class BaseClearService : BackgroundService { private readonly string dir = "upload"; private readonly ILogger logger; /// /// /// /// public BaseClearService(ILogger logger) { this.logger = logger; } /// /// /// /// /// protected override async Task ExecuteAsync(CancellationToken stoppingToken) { await Task.Delay(5000, stoppingToken);//延迟一会儿让webbapi先启动 logger.Information($"启动通用目录{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) { if (item.ToLower().Contains("notclear")) continue; DirectoryInfo dir = new DirectoryInfo(item); if (dir.EnumerateFiles().Any()) continue; //删除5分钟以前创建的空目录 if ((DateTime.Now - dir.CreationTime).TotalMinutes > 5) { dir.Delete(); } } } catch (Exception ex) { logger.Error(ex, $"删除{dir}目录中的空目录出错"); } #endregion #region 清理30分钟以前上传的文件 var files = Directory.EnumerateFiles(clearDir, "*", SearchOption.AllDirectories); foreach (var item in files) { if (item.ToLower().Contains("notclear")) continue; FileInfo f = new FileInfo(item); if ((DateTime.Now - f.LastWriteTime).TotalMinutes > 30) { try { f.Delete(); } catch (Exception ex) { logger.Error(ex, $"$删除{dir}目录中文件[{f.Name}]失败"); } } } #endregion } } }