你的文件过期了吗?

您肯定遇到过这样的情况,由于服务器系统日志文件长期积累,而且通常文件较大,导致服务器硬盘爆满。因此我们需要增加一个过期日志删除的工具。那我们就可以做这个工具吧。

实现目标:

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);

                    }

                   

                }

            }

 

 

说到这,整个功能已经实现完毕,高手拍砖吧。

代码下载

你可能感兴趣的:(文件)