记录一个用C#实现的windows计时执行任务的服务
这个服务实现的功能是每天下午六点统计一次指定路径的文件夹大小
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
namespace ProjectSizeStatistics
{
public partial class MyService1 : ServiceBase
{
public MyService1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
WriteInfo("服务启动");
InitTimer();
}
int _checkHour = 18; //每天六点检测
private string filePath = @"D:\FileSizeStatistic.txt";
void InitTimer()
{
var timer = new System.Threading.Timer(TimerCallBack, null, 5000, 360000); //一小时执行一次
}
void TimerCallBack(object pData)
{
DateTime now = DateTime.Now;
var hour = now.Hour;
if (hour == _checkHour)
{
SampleProjectSize();
}
}
/// <summary>
/// 采集项目大小
/// </summary>
void SampleProjectSize()
{
string path = @"D:\Projects\GitProject\ClientPro";
long size = GetDirectorySize(path);
int GB = (int)(size / 1024 / 1024 / 1024);
float remainGb = size * 1.0f / 1024 / 1024 / 1024 - GB;
WriteInfo($"{path} 文件大小为\"{size}\"字节\t{(GB + remainGb).ToString("f2")}G");
}
/// <summary>
/// 获取文件夹的大小,返回字节数
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
long GetDirectorySize(string path)
{
long size = 0;
DirectoryInfo dir = new DirectoryInfo(path);
foreach (var item in dir.GetFiles())
{
size += item.Length;
}
foreach (var item in dir.GetDirectories())
{
size += GetDirectorySize(item.FullName);
}
return size;
}
private void WriteInfo(string info)
{
//using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate))
//{
//}
using (StreamWriter writer = File.AppendText(filePath))
{
writer.WriteLine($"{DateTime.Now}\t{info}");
}
}
protected override void OnStop()
{
}
}
}
生成服务之后在对应bin/Debug目录下面会有一个对应的exe可执行文件,但是如果直接执行可执行文件会有这个弹窗,这是说明这个服务不能直接运行,要通过Installutil.exe去执行,
这里如果我们安装的VisualStudio的话,那么C盘的 C:\Windows\Microsoft.NET\Framework\v4.0.30319这个目录下面就会有InstallUtil.exe这个可执行文件,我们以管理员的身份运行命令提示符,之后进入到这个目录,执行这个命令
installutil.exe 你的服务exe的绝对路径
这样在windows服务中我们就能找到我们对应的服务了,启动它即可。
如果要卸载服务可执行以下命令
installutil.exe 你的服务exe的绝对路径 -u
小提示,我们每次修改我们的服务内容之后只需要重新生成服务项目,不需要重新安装服务,生成好之后,启动服务即可。