| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | using Microsoft.Extensions.Hosting;using Microsoft.Extensions.Logging;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace DW5S.WebApi{    /// <summary>    /// 基础清理服务(负责upload目录的清理,不会清理NotClear目录及其文件)    /// </summary>    public class BaseClearService : BackgroundService    {        private readonly string dir = "upload";        private readonly ILogger logger;        public BaseClearService(ILogger logger)        {            this.logger = logger;        }        /// <summary>        ///         /// </summary>        /// <param name="stoppingToken"></param>        /// <returns></returns>        protected override async Task ExecuteAsync(CancellationToken stoppingToken)        {            await Task.Delay(5000, stoppingToken);//延迟一会儿让webbapi先启动            logger.LogInformation($"启动通用目录{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.LogError(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.LogError(ex, $"$删除{dir}目录中文件[{f.Name}]失败");                    }                }            }            #endregion        }    }}
 |