工程优化——删除指定时间文件

  随时间越长,服务器里面的历史文件堆积得越来越多,所以要将一些历史文件删除。现在就来制作这一个工具。

一、设计程序

1.分析需求

  (1)主要目的就是删除文件,所以能够指定删除的文件类型,如果不指定缺省值为所有的文件类型。

  (2)能够指定某个目录下的文件

  (3)能够指定删除多少时间前的文件

2.设计程序的参数

  根据需求,可以知道程序的参数(加上程序本身的可执行程序)为 3 个 或 4个,因为用户可以不指定删除的文件类型。

  (1)第一个参数就是程序的可执行程序

  (2)第二个参数:指定哪个目录下的文件

  (3)第三个参数:指定多少时间前的文件要删除,这个时间是相对系统当前时间的。比如说,删除一天前的文件,那么先获取此刻的系统时间,系统时间减去一天,就得到一天前的时间。

  (4)第四个参数:指定删除的文件类型

3.分析设计程序的流程

  (1)打开指定的目录,以及要打开子目录,匹配要删除的文件类型

  在 CDir 类中,OpenDir() 的作用是打开指定的目录,并且能打开子目录,还有一个重要的功能就是:能够将指定的文件类型的文件,暂时放到 CDir 类中的容器中。

  (2)读取要删除的文件类型。

  在 CDir 类中,ReadDir() 的作用是将 OpenDir() 放入容器中文件读取出来。

  (3)计算指定时间段前的时间点,首先获取系统当前的时间点,然后减去指定时间段,就可以得到时间界限(比如一天前的时间界限),这个步骤可以由 LocalTime() 来完成。

  LocalTime() 可以获取系统的时间,这个时间可以加上偏移量,比如说获取当前系统的前3小时的时间点,那么偏移量为 -3。

  (4)删除文件,如果文件的最后修改时间比时间界限大,那么文件是在时间界限后面的,就不用删除。

  这里的时间都是字符串格式的,形式为:“yyyy-mm-dd,hh24:mi:ss”,如何比较这两个时间呢?用 strcmp() 即可。strcmp(str1,str2) ,从字符串的第一个字符开始,逐个比较字符的 ascii 码值,如果第一个字符相等就比较下一个。如果比较的下个字符,若str1<str2,则返回负数;若str1>str2,则返回正数。

  所以这两个时间也可以这样比较,看一下时间的格式就知道了:比如说 2021-5-11 和 1992-5-12, 使用 strcmp() 时,比较第一个字符(2 和 1)就知道 2021-5-11 大了,都不用比较后面的。这也是一个时间比较的技巧,因为这是从第一个字符比较的,从相当于从比较大的进制(千位,百位,十位)开始比较的,当 str1 千位大于 str2 的千位时,str1 肯定大于 str2 了。

二、代码实现

1、准备工作

  (1)根据已经确定的程序参数写好提示信息,以及信号处理函数

if ( ( argc != 3 ) && ( argc != 4 ) )
        {
                printf("本程序用于是数据中心的公共功能模块,用于删除指定目录下的历史文件。\n");
                printf("Using: /htidc/public/bin/deletefile pathname dayout [matchstr] \n");
                printf("Sample: /htidc/public/bin/deletefile /data/qxidc/ftp/surfdata 0.1 *.TXT \n\n");
                printf("pathname 为指定的目录。\n");
                printf("dayout 为指定多长时间,单位为天,比如为:1 删除1天前的文件。\n");
                printf("[matchstr] 为匹配的文件类型,缺省为所有文件类型。\n");
                return -1;
        }
		// 关闭全部信号和输入输出
        //CloseIOAndSignal();

        // 程序退出信号处理
        signal(SIGINT,EXIT);
        signal(SIGTERM,EXIT);

2.打开指定的目录

(1)代码实现

       CDir Dir;

        // 首先打开目录,并且打开子目录
        // 如果没有匹配的文件类型,那么就全部删除—也就是 *
        // 所以先定义一个字符串变量来存放 匹配的类型
        char strPathname[301];
        memset(strPathname,0,sizeof(strPathname));
        strcpy(strPathname,argv[1]);

        char strMatch[50];
        memset(strMatch,0,sizeof(strMatch));

        if ( argc == 3 ) strcpy(strMatch,"*");
        else strcpy(strMatch,argv[3]);

        if ( Dir.OpenDir(strPathname,strMatch,10000,true,false) == false )
        {
                printf("Dir.OpenDir(%s) 失败。\n",strPathname);
                return -1;
         }                      

(2)文件类型缺省处理

在这里插入图片描述

3.删除指定的文件类型

(1)计算时间界限

在这里插入图片描述

(2)读取文件删除文件

在这里插入图片描述
在这里插入图片描述

4.工具源代码

#include "_freecplus.h"

// 信号退出处理函数
void EXIT(int sig);


int  main(int argc,char *argv[])
{
        if ( ( argc != 3 ) && ( argc != 4 ) )
        {
                printf("本程序用于是数据中心的公共功能模块,用于删除指定目录下的历史文件。\n");
                printf("Using: /htidc/public/bin/deletefile pathname dayout [matchstr] \n");
                printf("Sample: /htidc/public/bin/deletefile /data/qxidc/ftp/surfdata 0.1 *.TXT \n\n");
                printf("pathname 为指定的目录。\n");
                printf("dayout 为指定多长时间,单位为天,比如为:1 删除1天前的文件。\n");
                printf("[matchstr] 为匹配的文件类型,缺省为所有文件类型。\n");
                return -1;
        }

signal(SIGINT,EXIT);
        signal(SIGTERM,EXIT);

        /* 删除指定目录下的历史文件,涉及到目录操作*/
        // 定义目录操作对象
        CDir Dir;

        // 首先打开目录,并且打开子目录
        // 如果没有匹配的文件类型,那么就全部删除—也就是 *
        // 所以先定义一个字符串变量来存放 匹配的类型
        char strPathname[301];
        memset(strPathname,0,sizeof(strPathname));
        strcpy(strPathname,argv[1]);

        char strMatch[50];
        memset(strMatch,0,sizeof(strMatch));

        if ( argc == 3 ) strcpy(strMatch,"*");
        else strcpy(strMatch,argv[3]);
        if ( Dir.OpenDir(strPathname,strMatch,10000,true,false) == false )
        {
                printf("Dir.OpenDir(%s) 失败。\n",strPathname);
                return -1;
        }

        // 打开了目录,就从目录中每次读取一个文件,如果是指定时间前的文件就删除
        // 先获取系统的当前时间,然后减去指定的时间,就可以得到时间界限
        // 接着用 时间界限和文件的最后修改时间去比较
        // 如果文件的最后修改时间小于时间界限就删除文件

        // 1.先计算要减去的时间
        int dDayOut = 0 - (int )( atof( argv[2] ) * 24 * 60 * 60 );

        // 2.获取系统当前时间,并减去时间得到时间界限,放在一个字符数组中
        char strTimeOut[31];
        LocalTime(strTimeOut,"yyyy-mm-dd hh24:mi:ss",dDayOut);

        // 3.每次读取一个文件
        while ( Dir.ReadDir() == true )
        {
                if ( strcmp(Dir.m_ModifyTime,strTimeOut) > 0 ) continue;

                printf("删除 %s ok.\n",Dir.m_FullFileName);

                REMOVE(Dir.m_FullFileName);
        }

        return 0;
}

void EXIT(int sig)
{
        printf("信号为:%d,程序退出。\n",sig);
        exit(0);
}

三、总结

  1.要熟悉框架中的 CDir 类中的函数

  2.学会用 LocalTime() 获取想要的时间点,主要是系统当前时间加上偏移量

  3、确定好时间的表达格式为字符串时,可以利用 strcmp() 比较大小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值