清理过期临时文件线程单元文件
//用到不常见的TWin32FindData结构,判断文件的生成日期/创建日期等;
Windows.FindFirstFile(PChar(sFileName), ffd); //根据文件名查找文件
Windows.FindClose(sHandle);
FileTimeToLocalFileTime(fTime, lft); //将一个FILETIME结构转换成本地时间
FileTimeToDosDateTime(lft, LongRec(dft).HI, LongRec(dft).Lo); //将一个 win32 FILETIME 值转换成DOS日期和时间值
Result:= FileDateToDateTime(dft); //返回将文件日期时间类型转换日期时间类型
//读取配置文件
function TMainForm.ReadClearConfig: Boolean;
var
MyIniFile: TIniFile;
begin
Result := True;
MyIniFile := TIniFile.Create(Pub_EXEPath + '\ClearCatchServer.ini');
try
try
BDBQCSPFTempDir := (MyIniFile.ReadString('ClearConfig', 'BDBQCSPFTempDir', ''));
BDDCBFTempDir := (MyIniFile.ReadString('ClearConfig', 'BDDCBFTempDir', ''));
BDDZTempDir := (MyIniFile.ReadString('ClearConfig', 'BDDZTempDir', ''));
BDSPFTempDir := (MyIniFile.ReadString('ClearConfig', 'BDSPFTempDir', ''));
BDSXPDSSTempDir := (MyIniFile.ReadString('ClearConfig', 'BDSXPDSSTempDir', ''));
BDZJQSTempDir := (MyIniFile.ReadString('ClearConfig', 'BDZJQSTempDir', ''));
LQDZTempDir := (MyIniFile.ReadString('ClearConfig', 'LQDZTempDir', ''));
LQRFTempDir := (MyIniFile.ReadString('ClearConfig', 'LQRFTempDir', ''));
LQYSZFTempDir := (MyIniFile.ReadString('ClearConfig', 'LQYSZFTempDir', ''));
ZQDZTempDir := (MyIniFile.ReadString('ClearConfig', 'ZQDZTempDir', ''));
LogDir :=(MyIniFile.ReadString('ClearConfig', 'LogDir', ''));
IDateLimit := (MyIniFile.ReadString('ClearConfig', 'IDateLimit', ''));
sClearTimeStrat := (MyIniFile.ReadString('ClearConfig', 'sClearTimeStrat', ''));
sClearTimeEnd := (MyIniFile.ReadString('ClearConfig', 'sClearTimeEnd', ''));
except on E : Exception do
begin
WriteLog(E.Message);
Result := False;
end;
end;
finally
MyIniFile.Free;
end;
end;
//启动线程 之前还要获取要删除的各文件夹名称
if iClearFileStart = 1 then begin slDirList.Clear; slDirList.Delimiter := '|'; slDirList.DelimitedText := BDBQCSPFTempDir +'|'+ BDDCBFTempDir +'|'+ BDDZTempDir +'|'+ BDSPFTempDir +'|'+ BDSXPDSSTempDir +'|'+ BDZJQSTempDir+'|' + LQDZTempDir + '|' + LQRFTempDir + '|' + LQYSZFTempDir + '|' + ZQDZTempDir + '|' + LogDir; ClearOverdueFileThd := TClearOverdueFileThd.create; ClearOverdueFileThd.resume; end;
1 {******************************************************************************* 2 Copyright (C), 2011-2015, 3 File name: ThdClearOverdueFile 4 Author: 5 Version: 1.0 6 Date: 2013-05-02 7 Description: 清理过期临时文件 8 Others: 9 Function List: 10 History: 11 1. Date: 2013-06-09 12 Author: guoqiang.xu 13 Modification: debug 14 *******************************************************************************} 15 unit ThdClearOverdueFile; 16 17 interface 18 19 uses 20 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Dialogs, MyAccess, 21 PubDefine, DateUtils, StrUtils, StdCtrls, Forms; 22 23 type 24 TClearOverdueFileThd = class(TThread) 25 private 26 { Private declarations } 27 28 public 29 { Public declarations } 30 constructor Create; 31 procedure Execute; override; 32 destructor Destroy; override; 33 function DelOverduefile(path:string;date:TDateTime):boolean; 34 function GetFilesTime(sFilename: String; Timetype: Integer): TDateTime; 35 end; 36 37 implementation 38 39 uses FrmMain; 40 41 constructor TClearOverdueFileThd.Create; 42 begin 43 inherited Create(True); //继承 44 freeOnTerminate := True; //设定默认Terminate后释放所占资源 45 end; 46 47 procedure TClearOverdueFileThd.Execute; 48 var 49 i : Integer; 50 CurrTime : string; 51 begin 52 CurrTime := FormatDateTime('HHMM',Now()); 53 // 2013-06-09 guoqiag.xu 原来的if条件太长了,识别不了。 更新把删除条件减少 54 //若在这个删除的范围内 ,则删除 55 if (CurrTime >= MainForm.sClearTimeStrat) and (CurrTime < MainForm.sClearTimeEnd) then 56 begin 57 // 循环删除文件夹 58 for i:=0 to MainForm.slDirList.Count - 1 do 59 begin 60 DelOverduefile(Pub_EXEPath+ '\' + MainForm.slDirList[i],Now()); 61 Sleep(300); 62 end; 63 sleep(1000); 64 end; 65 end; 66 67 function TClearOverdueFileThd.DelOverduefile(path:string;date:TDateTime):boolean; 68 var 69 rec : TsearchRec; 70 ret,tcount : integer; 71 sDirFlie,dt1,dt2,dt3 : string; 72 cdt,chkd : Tdatetime; 73 begin 74 result := False; 75 try 76 try 77 tcount := 0; 78 ret:=findfirst(path+'\'+'*.txt',faanyfile,rec); //用TsearchRec查找目录结构 79 while ret=0 do 80 begin 81 sDirFlie:=path+'\'+rec.name; 82 cdt:=GetFilesTime(sDirFlie, 0); 83 chkd:= date; 84 //以文件的创建时间为基准 85 dt1:=datetostr(cdt); 86 dt2:=datetostr(GetFilesTime(sDirFlie, 1)); 87 dt3:=datetostr(GetFilesTime(sDirFlie, 2)); 88 //ITimeLimit是从配置文件读取 89 if chkd - StrToInt(mainform.IDateLimit) > cdt then //创建日期要小于 某个间隔IDateLimit的 90 begin 91 application.ProcessMessages; 92 tcount:=tcount+1; 93 deletefile(sDirFlie); 94 MainForm.LogInfo('成功删除,'+ path +'目录下->' + IntToStr(tcount) +'个过期文件!',True); 95 end; 96 ret:=findnext(rec); 97 end; 98 Result := True; 99 except on E:Exception do 100 begin 101 MainForm.LogInfo('文件删除异常,' + e.Message,True); 102 Result := False; 103 Exit; 104 end; 105 end; 106 finally 107 findclose(rec); 108 end; 109 end; 110 111 function TClearOverdueFileThd.GetFilesTime(sFilename: String; Timetype: Integer): TDateTime; 112 var 113 ffd: TWin32FindData; 114 dft: DWord; 115 lft, fTime: TFileTime; 116 sHandle: THandle; 117 begin 118 sHandle:= Windows.FindFirstFile(PChar(sFileName), ffd); //根据文件名查找文件 119 120 if (sHandle <>INVALID_HANDLE_VALUE) then //不是无效的 121 begin 122 case Timetype of 123 //0为创建时间,1为最后修改时间,2为最后访问时间。 124 0: fTime:= ffd.ftCreationTime; 125 1: fTime:= ffd.ftLastWriteTime; 126 2: fTime:= ffd.ftLastAccessTime; 127 end; 128 // 129 Windows.FindClose(sHandle); 130 FileTimeToLocalFileTime(fTime, lft); //将一个FILETIME结构转换成本地时间 131 FileTimeToDosDateTime(lft, LongRec(dft).HI, LongRec(dft).Lo); //将一个 win32 FILETIME 值转换成DOS日期和时间值 132 Result:= FileDateToDateTime(dft); //返回将文件日期时间类型转换日期时间类型 133 end 134 else 135 Result:= 0; 136 end; 137 138 139 destructor TClearOverdueFileThd.Destroy; 140 begin 141 inherited; 142 end; 143 144 end.

浙公网安备 33010602011771号