您肯定遇到过这样的情况,由于服务器系统日志文件长期积累,而且通常文件较大,导致服务器硬盘爆满。因此我们需要增加一个过期日志删除的工具。那我们就可以做这个工具吧。
实现目标:
(1)删除指定目录下、满足指定文件名格式(采用正则匹配)、且设定过期天数的文件;严格采用正则匹配,避免出现误删除导致不必要的损失。
(2)可以同时管理多个目录下的文件。
(3)实现为一个控制台程序,在服务器部署时利用计划任务设定程序的运行时间。
(4)对删除的文件要有日志记录。
就像目标所说的,只有满足正则的、且过期的文件才可以delete。并且可以操作多个目录。那我们该如何实现呢?
本文中使用的是配置节点实现的,配置节点如下:
<section name="FileNet" type="ExpireFileRemoveApp.FileSection,ExpireFileRemoveApp"/>
<FileNet>
<FileDirectory>
<!--
//pattern,expiredate不能为空,避免出现误删除导致不必要的损失!
//pattern:正则 Regex reg=new Regex(pattern);
//expiredate:过期时间[间隔的天数]
-->
<add path="D:\temp1\log051121-051206\" pattern="^ex[0-9]+.log$" expriedate="2"></add>
</FileDirectory>
</FileNet>
配置节点的源代码可以在文章的末尾下载
删除文件的的日志记录,用的是大名鼎鼎的log4Net. dll.有不知道的可以查询相关的资料.
提供一个FileManagerProcessor.cs提供IsExpire,IsMatch方法来判断文件是不是符合删除条件。代码如下:
public static class FileManagerProcessor
{
private static Regex reg=null;
/// <summary>
/// 时间比较
/// </summary>
/// <param name="dt1"></param>
/// <param name="dt2"></param>
/// <returns></returns>
private static int Subtract(DateTime dt1, DateTime dt2)
{
TimeSpan timespan = dt1.Subtract(dt2);
//return timespan.Days > 0 ? true : false;
return timespan.Days;
}
/// <summary>
/// 判断文件是不是过期
/// </summary>
/// <param name="creationtime"></param>
/// <param name="expiretime"></param>
/// <returns></returns>
public static bool IsExpire(DateTime creationtime, DateTime expiretime)
{
return Subtract(creationtime, expiretime) <= 0;
}
public static bool IsMath(string filename, string pattern)
{
if (string.IsNullOrEmpty(filename))
return false;
reg = new Regex(pattern);
bool flag = reg.IsMatch(filename);
return flag;
}
}
文件的删除是递归删除的,实现起来也比较简单,注释也比较详细,就不多说了。
public static void DeleteFolder(string path, string pattern, string expiredate)
{
// 检查目标目录是否以目录分割字符结束如果不是则添加之
if (path[path.Length - 1] != Path.DirectorySeparatorChar)
{ path += Path.DirectorySeparatorChar; }
//得多目录列表
string[] filelist = Directory.GetFileSystemEntries(path);
//遍历目录
foreach (string file in filelist)
{
// 先当作目录处理如果存在这个目录就递归Delete该目录下面的文件
if (Directory.Exists(file))
{
DeleteFolder(path + Path.GetFileName(file), pattern, expiredate);
}
else
{
//do your things here
string fullpath = path + Path.GetFileName(file);
FileInfo info = new FileInfo(fullpath);
string filename = info.Name;
DateTime create = info.CreationTime;
//bool enableFilter = Convert.ToBoolean(ConfigurationManager.AppSettings["enableFilter"].ToString());
//if (enableFilter)
int interval = Convert.ToInt32(expiredate);
interval = -interval;
DateTime passtime = DateTime.Now.AddDays(interval);
if (FileManagerProcessor.IsExpire(create, passtime) && FileManagerProcessor.IsMath(filename, pattern))
{
File.Delete(path + Path.GetFileName(file));
string tip = string.Format("[{0}已被删除,删除时间:{1}", filename, DateTime.Now);
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine(tip);
//log4net
log.Debug(tip);
}
}
}
说到这,整个功能已经实现完毕,高手拍砖吧。