实际的项目的施展过程中会产生大量的数据有用的没用的。有的需要显示,有的不需要。有时候甚至需要有弹出类似的MessageBox用户去选择然后才能进行程序的正常的运行,比如更换了产品类型。
有一种情况在项目的初期调试过程中需要记录数据。用于产品统计或者出问题后的数据分析。我们通常使用写文件的方法把数据写到硬盘里。
但这样的问题是文件越来越多,占用越来越大,而且示教器上删除文件的操作真的是繁琐到逆天,考虑到培训难度问题,以及最近的境外订单暴涨,想到和老外鸡同鸭讲,真的是一个头两个大,于是决定今天(20260129)抽时间研究一下自动删除的程序怎么写。
首先在《RAPID指令、函数和数据类型》(3HAC050917-010)这个说明书一番遨游下,成功找到相关的几个函数。
- FileTimeDnum- 检索有关文件的时间信息
- CTime- 将当前时间作为字符串来读取
- CDate- 将当前日期作为字符串来读取
- GetTime- 将当前时间作为一个数值来读取
因为FileTimeDnum的返回值是Unix时间戳,但是系统上没有有关于时间戳的另外的函数,所以最开始计划使用CTime和CDate读取到控制器的时间,用来计算Unix时间戳,不过直到我安装的RobotWare 6.15.08都没有现成函数,加上懒,就直接采用了创建文件--读取时间戳--删除文件的方式来获取当前的时间戳,毕竟读写了硬盘,在这个硬盘寿命也许比机器人本体的寿命更长的时代,虽说不必太过纠结,但或许在将来,我会实现根据系统计算时间戳的函数(先挖坑)。所以接下来不会讲解除了FileTimeDnum之外的其他函数。
FileTimeDnum- 检索有关文件的时间信息

根据上面的说明,可以写出下面这个函数。
!-----------------------------------------------
!程序功能:获取文件时间戳
!参数:fileName:需要求时间戳的文件
!返回值:文件的时间戳
!-----------------------------------------------
FUNC dnum ObtainTheFileTimestamp(string fileName)
VAR dnum Timestamp;
Timestamp:=FileTimeDnum(fileName); !计算时间戳
RETURN Timestamp; !返回计算到的时间戳
ENDFUNC
上面的函数的参数是文件路径+文件名,所以我们还需要获取到文件夹里全部文件的名称,这里需要用到ReadDir以及OpenDir这两个函数还有RemoveFile指令,篇幅原因加上上面的函数和指令用法并不困难,所以这里略过,详情请看《RAPID指令、函数和数据类型》(3HAC050917-010)。
TPErase; !清屏
OpenDir dir1,filePath; !打开需要清理的路径
WHILE ReadDir(dir1,fileName) DO !循环读取文件名
IF fileName<>"." AND fileName<>".." THEN !去除上级目录和当前目录
IF ObtainTheFileTimestamp(filePath+fileName)<DeadlineTimestamp THEN !判断文件的时间戳是否小于截止时间戳
RemoveFile filePath+fileName; !小于截止时间戳,删除
TPWrite "RemoveFile : " + fileName; !写屏
ELSE
TPWrite "MaintainFile : " + fileName; !大于截止时间戳,保留,写屏
ENDIF
ENDIF
ENDWHILE
CloseDir dir1; !关闭路径
上面的两段代码就是这个模块的核心了,加上一些其他功能,最终的模块如下
MODULE AutoDeleteFiles(NOVIEW)
! @file AutoDeleteFiles.mod
! @brief 本模块实现自动删除文件
! @author JiangHao
! @date 2026-01-29
! @version 1.1
!
! @details
! 本模块实现了自动计算文件生成时间,并且根据配置自动删除N天前的文件,以便于节省机器人内部空间,以及简化文件删除的流程
! 修改记录:
! - 2026-01-29: 初始版本创建。
! - 2026-01-29: 修改自动删除文件程序增加传入外部计算的时间戳
! @note
! - 时间戳计算网站:https://tool.lu/timestamp/
! - Uinx时间戳简介:Unix时间(也称为Unix时间戳)是从1970年1月1日00:00:00(UTC)开始所经过的秒数,不包括闰秒。它是一种用于表示时间点的标准方式,广泛应用于计算机系统和编程中。
CONST string baseFilePath:="HOME:/BaXi/"; !基础路径,指要自动删除文件的路径
CONST dnum N_DaysAgo:=7; !删除N天前的文件
PROC main()
!AutomaticallyDeleteFiles baseFilePath,N_DaysAgo;
AutomaticallyDeleteFiles baseFilePath,N_DaysAgo\Timestamp:=1769687393;
ENDPROC
!-----------------------------------------------
!程序功能:计算当前时间戳
!参数:filePath:在该目录下创建文件,计算当前时间的时间戳
!返回值:当前时间的时间戳
!-----------------------------------------------
FUNC dnum ObtainTheCurrentTimestamp(string filePath)
VAR iodev logfile;
VAR dnum Timestamp;
Open filePath\File:="TimeCalculationFile.txt",logfile\Write; !创建文件
Close logfile; !关闭文件
Timestamp:=ObtainTheFileTimestamp(filePath+"TimeCalculationFile.txt"); !计算时间戳
RemoveFile filePath+"TimeCalculationFile.txt"; !删除文件
RETURN Timestamp; !返回当前时间戳
ENDFUNC
!-----------------------------------------------
!程序功能:获取文件时间戳
!参数:fileName:需要求时间戳的文件
!返回值:文件的时间戳
!-----------------------------------------------
FUNC dnum ObtainTheFileTimestamp(string fileName)
VAR dnum Timestamp;
Timestamp:=FileTimeDnum(fileName); !计算时间戳
RETURN Timestamp; !返回计算到的时间戳
ENDFUNC
!-----------------------------------------------
!程序功能:计算N天前时间戳差值
!参数:days:计算天数
!返回值:时间戳差值
!-----------------------------------------------
FUNC dnum CalculateTimestamp_N_DaysAgo(dnum days)
VAR dnum Timestamp;
Timestamp:=days*24*60*60; !计算差值
RETURN Timestamp; !返回差值
ENDFUNC
!-----------------------------------------------
!程序功能:自动删除文件
!参数:filePath:删除该路径下days天前的文件;
!参数:days:删除天数
!参数:Timestamp:时间戳(可选参数),当不选择该参数时,会自动求当前时间戳,传入该参数时删除该参数的days天前的文件
!返回值:无
!-----------------------------------------------
PROC AutomaticallyDeleteFiles(string filePath,dnum days,\dnum Timestamp)
VAR dnum DeadlineTimestamp; !截止时间戳
VAR dir dir1; !文件目录结构
VAR string fileName; !读取到的文件名
IF filePath = "HOME:" OR filePath = "HOME:/" THEN !判断是否根目录
UIMsgBox \Header:="The path is illegal.",
"The path is illegal.Please do not select the root directory."
\Icon:=iconError; !报错图标
RETURN;
ENDIF
IF NOT strPart(filePath,strlen(filePath),1)="/" THEN !判断结尾字符,防止拼接错误
UIMsgBox \Header:="The path is illegal.",
"The path is illegal.Please ensure that the last character is '/'."
\Icon:=iconError; !报错图标
RETURN;
ENDIF
IF NOT IsFile(filePath) THEN !判断路径存在
UIMsgBox \Header:="The path does not exist.",""
\Icon:=iconError; !报错图标
RETURN;
ENDIF
IF Present(Timestamp) THEN
DeadlineTimestamp:=Timestamp-CalculateTimestamp_N_DaysAgo(days); !计算截止传入时间戳N天前的时间戳
ELSE
DeadlineTimestamp:=ObtainTheCurrentTimestamp(filePath)-CalculateTimestamp_N_DaysAgo(days); !计算截止现在N天前的时间戳
ENDIF
TPErase; !清屏
OpenDir dir1,filePath; !打开需要清理的路径
WHILE ReadDir(dir1,fileName) DO !循环读取文件名
IF fileName<>"." AND fileName<>".." THEN !去除上级目录和当前目录
IF ObtainTheFileTimestamp(filePath+fileName)<DeadlineTimestamp THEN !判断文件的时间戳是否小于截止时间戳
RemoveFile filePath+fileName; !小于截止时间戳,删除
TPWrite "RemoveFile : " + fileName; !写屏
ELSE
TPWrite "MaintainFile : " + fileName; !大于截止时间戳,保留,写屏
ENDIF
ENDIF
ENDWHILE
CloseDir dir1; !关闭路径
ENDPROC
ENDMODULE
模块文件可以点击这里下载
文章评论