目录

免责声明

介绍

解决方案

添加配置设置

添加带有文件夹列表的配置文件

我们的代码

将应用程序转换为Windows服务


创建Windows服务曾经是一个繁琐的过程,但是随着.NET Core 3.0中引入的新工作程序服务框架变得更加容易。本文中的代码主要是为了向读者介绍辅助服务,并说明如何将辅助服务部署为Windows服务,但希望该应用程序本身也具有实际用途。

  • 下载源文件-4 KB

免责声明

我们在此处创建的服务用于从独立配置文件中指定的文件夹列表中删除早于特定日期的文件。该应用程序已经过测试,据我所知它可以在我的环境中运行。我不保证它将在您的环境中完美无缺。在生产环境中使用此功能之前,强烈建议您执行一些其他测试。

介绍

在本文中,我将介绍如何在Visual Studio中使用Worker Service模板创建简单的Windows Service。

在引入.NET Core 3.0中的Worker Services之前,您可能会使用.NET Windows Service模板创建Windows服务。我一直认为,使用该模板的经验从来都不是很直观的。您可能会遇到的第一个问题是,如果不实现某些代码黑客,就无法在Visual Studio环境中运行该服务。此外,该模板并没有为您提供使服务按预期运行所需的实际指导。幸运的是,有了.NET 3.0和Worker Services,所有这些都变得更加容易。

解决方案

要阅读本文,您需要在您的环境中安装Visual Studio 2019和.NET Core 3.0。

首先,您需要创建一个新项目,并选择下图所示的工作流程模板:

添加配置设置

appsettings.json文件中,我们将需要添加一些配置。一个配置的阈值,说明最大允许年龄的文件之前,我们删除它。让我们将此设置称为NumberOfDaysBeforeDelete。我将此值设置为90天。除此之外,我们需要包含要监视的文件夹列表的独立配置文件的文件路径。我将其称为ConfigurationFilePath设置,并将其指向我的c:\temp文件夹中的某个位置。需要最后一个设置来配置此服务将执行我们的自定义代码的时间间隔。我称这个设置为RunIntervallInHours,然后将值设置为12小时,这意味着该服务每天两次检查配置文件中每个文件夹的内容,并删除最后写入日期超过90天的所有文件。这三个配置设置被分组为appsettings.json文件中的一个节点,我称之为“App.Configurations”,请参见以下内容:

{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"App.Configurations": {"ConfigurationFilePath": "C:\\Temp\\CleanUpFolders\\CleanUpConfigurations.config","NumberOfDaysBeforeDelete": "10","RunIntervallInHours": "12"}
}

请注意,您的项目中同时有一个“appsetttings.json”文件和一个“appsettings.development.json”文件。在运行时使用哪个appsettings.json文件取决于您的环境设置。从Visual Studio运行此服务时,默认情况下将使用文件Properties/launchSettings.json配置的开发设置。

添加带有文件夹列表的配置文件

我在c:\Temp\CleauUpFoders\创建一个名为CleanUpConfigurations.config的文件,并将以下两行放入其中:

C:\Temp\CleanUpFolders\Folder1
C:\Temp\CleanUpFolders\Folder2

我还在同一位置创建文件夹“Folder1”和“Folder2”。

我们的代码

在新创建的解决方案中,最初需要我们关注两个文件,用于启动应用程序的program.cs和包含该解决方案的自定义代码的worker.cs。在program.cs文件中,您将找到用于设置主机环境的代码。为了便于将此应用程序作为Windows服务运行,您需要添加以下NuGet软件包。

Install-Package Microsoft.Extensions.Hosting.WindowsServices

安装该软件包后,您可以在Host.CreateDefaultBuilder(args)后面添加行.UseWindowsService(),以便最终在program.cs文件中添加以下内容。

public class Program{public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).UseWindowsService().ConfigureServices((hostContext, services) =>{services.AddHostedService<worker>();});}

worker.cs文件中,我们首先将IServiceScopeFactory实例插入构造函数。这将用于访问appsettings配置文件。

public Worker(ILogger<worker> logger, IServiceScopeFactory serviceScopeFactory){_logger = logger;_serviceScopeFactory = serviceScopeFactory;}

为了确保每次启动服务时都读取配置,我重写了该方法StartAsync并在此处检索我的应用程序配置:

public override Task StartAsync(CancellationToken cancellationToken){_configuration = _serviceScopeFactory.CreateScope().ServiceProvider.GetRequiredService<iconfiguration>();_numberOfDaysBeforeDelete = int.Parse(_configuration["App.Configurations:NumberOfDaysBeforeDelete"]);_runIntervallInHours = int.Parse(_configuration["App.Configurations:RunIntervallInHours"]);_folderPaths = File.ReadAllLines(_configuration["App.Configurations:ConfigurationFilePath"]).Select(x => x.Trim()).ToList();return base.StartAsync(cancellationToken);}

请注意,我是如何从ConfigurationFilePath设置中所述文件中读取所有行并将其放入list _folderPaths的。

在Worker类中声明以下变量:

private IList<string> _folderPaths;
private int _numberOfDaysBeforeDelete;
private int _runIntervallInHours;

从我们的配置文件中检索文件夹并删除所有90天以上的文件的代码将放置在该ExecuteAsync方法中。ExecuteAsync以CancellationToken作为参数。CancellationToken非常重要,因为它将用于识别服务何时停止。发生这种情况时,属性IsCancellationRequested将设置为true。因此,我们ExecuteAsync代码的第一行是:

while (!stoppingToken.IsCancellationRequested)

我将在此方法中进一步检查IsCancellationRequested,以确保在收到取消请求时尽快停止执行。用于获取文件天数x天以上并删除它们的代码分为两行:

var files = Directory.GetFiles(path).Select(file => new FileInfo(file)).Where
(file => file.LastWriteTime < DateTime.Now.AddDays(-1* _numberOfDaysBeforeDelete)).ToList();// Delete found files
files.ForEach(file => file.Delete());

在关闭while循环之前,我延迟了一下。由于我们的setting _runIntervallInHours时间设置为12小时,因此该代码将使服务停止12小时,然后再继续执行。

await Task.Delay(TimeSpan.FromHours(_runIntervallInHours), stoppingToken);

请注意,此处使用了取消标记,这会导致Windows服务停止时取消等待过程。

该ExecuteAsync方法的完整代码如下所示:

protected override async Task ExecuteAsync(CancellationToken stoppingToken){while (!stoppingToken.IsCancellationRequested){_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);foreach (var path in _folderPaths){if (!stoppingToken.IsCancellationRequested){// Get old filesvar files = Directory.GetFiles(path).Select(file => new FileInfo(file)).Where(file => file.LastWriteTime < DateTime.Now.AddDays(-1* _numberOfDaysBeforeDelete)).ToList();// Delete found filesfiles.ForEach(file => file.Delete());}}await Task.Delay(TimeSpan.FromHours(_runIntervallInHours), stoppingToken);}}

那就是我们需要的所有代码。您只需按F5键,然后直接从Visual Studio运行该应用程序,然后看它是否有效。

将应用程序转换为Windows服务

现在继续并发布应用程序。

到文件夹:

以管理员身份打开PowerShell终端并运行以下命令:

sc.exe create FolderCleanUpService binpath= "C:\Apps\FolderCleanUpService.exe" start= auto

这会将服务安装在Windows计算机上。

您可以将服务放置在所需的任何位置,我在这里选择将其放置在CApps文件夹中。我使用该标志来确保Windows启动时自动启动该服务。要设置服务描述,您需要执行第二条命令:start=auto

sc.exe description "FolderCleanUpService"
"This service monitors and deletes files older than 90 days"

按(Window + R)并运行命令services.msc,然后您应该会看到所有服务的列表,并且在该列表中您应该能够看到该FolderCleanUpService服务。您需要首次手动启动它,但是由于启动类型设置为自动,因此它将在重新启动后自动自行启动。

您可以使用以下命令删除服务:

sc.exe delete "FolderCleanUpService"

使用.NET Core 3.1构建Windows Worker服务以删除文件夹中的旧文件相关推荐

  1. Windows下如何用C语言清空特定文件夹中的所有文件

    #include "iostream.h"    //由于该博客系统发布是不能显示正常,代码如需调试,只需将改成""即可 #include "stri ...

  2. windows文件夹中的哪些文件可以删除

    经过以下的设置后,你的系统会更加清爽.简洁.高效! 1.打开"我的电脑"-"工具"-"文件夹选项"-"查看"-在&quo ...

  3. 用Python在Windows或Linux下批量删除文件夹中指定的文件

    情况说明:当在一个文件夹下面有好几十个或几百个文件需要删除,此时一一去挑选费时费力,特别是在Linux下面.因此,需要批量删除文件. 对训练样本(图像)和测试样本(图像)进行评估时候,需要查看是数据本 ...

  4. windows编写bat脚本删除隐藏文件夹下的所有文件

    删除隐藏文件夹下的所有文件 @echo off cd C:\Users\%username%\path\ #path修改为自己系统隐藏文件夹所在的文件夹路径名称 dir del /q/a/f/s .s ...

  5. C/C++遍历Windows文件夹下的所有文件

    因为文件夹中往往包含文件和文件夹.想要遍历所有的文件,必须遍历文件夹中所有的文件夹.很显然,这个描述满足递归的两个要素:(1)问题的规模在不断的缩小,且新问题的模式与旧问题相同.很显然文件夹中含有子文 ...

  6. c语言中sub是什么文件,Windows操作: (1)在C:盘根目录下建立SUB文件夹,在SUB文件夹下建立SUB1子文件夹和SUB2子文件夹。(2_开卷宝...

    Windows操作:(1)在C:盘根目录下建立SUB文件夹.在SUB文件夹下建立SUBl子文件夹和SUB2子 Windows操作: (1)在C:盘根目录下建立SUB文件夹.在SUB文件夹下建立SUBl ...

  7. Windows系统查找多个文件夹里的重复文件

    目录 powershell终端直接输入指令的方法 输出结果简陋 输出结果完整 编写.执行.ps1文件的方法 分类输出结果 根据文件名.长度.拓展名查找 根据MD5值查找 将结果写入文件中 代码解释(不 ...

  8. 使用Python批量删除windows下特定目录的N天前的旧文件实战:Windows下批量删除旧文件、清除缓存文件、解救C盘、拒绝C盘爆炸

    使用Python批量删除windows下特定目录的N天前的旧文件实战:Windows下批量删除旧文件.清除缓存文件.解救C盘.拒绝C盘爆炸 目录

  9. sts在文件夹中显示_工作中很多问题,巧用Windows 10任务栏,几分钟快速解决

    在日常工作中,很多计算机操作我们在那琢磨半天就是弄不出来,而有些人几分钟就能快速解决,今天举几个使用中的例子来说明,巧用Windows 10任务栏就能轻轻松松的完成! 1.一步打开网页 任务栏大家都知 ...

最新文章

  1. 现存问题以及解决方案:在ASP.NET AJAX中从客户端向服务器端传送DataTable
  2. Windows端5款MySQL客户端工具
  3. 一个含有crc32算法的CrackMe分析
  4. 【管理】高级经理与普通经理区别到底在哪?
  5. ps清理缓存脚本_清理垃圾脚本,让你的电脑丝滑如新!
  6. 转:传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确 .
  7. IntelliJ IDEA 项目结构旁边出现 0%methods,0% lines covered 解决
  8. jax-rs jax-ws_迟来总比没有好:SSE或服务器发送的事件现在已在JAX-RS中
  9. Python len函数 - Python零基础入门教程
  10. java与javascript
  11. 语言怎么得到直流电压并采样_250V10A高频直流电源/大电流直流稳压稳流电源
  12. 如何判断一个算式是几位运算
  13. 统计当前文件夹下pdf文件的页码总数
  14. 【SqlServer】不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的表进行了更改或者启用了“阻止保存要求重新创建表的更改”选项
  15. html 360打不开,360浏览器打不开如何解决_360浏览器打不开解决教程
  16. 文本自动生成研究进展与趋势
  17. 贴片电解电容47UF16V 6.3*4.5
  18. 初识计算机程序ppt,初识计算机程序.ppt
  19. 怎么识别图片中的文字?这三款识别软件还不错
  20. 为什么计算机的伟大发明总是诞生于美国?

热门文章

  1. 间接寻址级别不同_单片机指令系统与寻址方式
  2. JAVA调用 keras,在TensorFlow(Python, Java)环境下使用Keras模型
  3. python书籍pdf文档密码-Python玩转PDF的各种骚操作
  4. 走错路也要美美的!富有创意的404页面设计灵感
  5. 设计灵感|排版太死板?提高品质的角度很重要
  6. APP设计|搜索页面设计灵感
  7. 室内高品质海报框架模型模板(Photoshop PSD)
  8. 干货 | 设计大佬用的UI手机样机,你要么?
  9. mysql关联语句优化_MySql语句关联优化问题,为什么加了限制条件反而更慢?
  10. golang 相互引用_Golang与C互用以及调用C的so动态库和a静态库