清理过期临时文件线程单元文件

//用到不常见的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.
线程单元代码

 

  

posted @ 2015-04-13 14:18  海蓝7  阅读(174)  评论(0)    收藏  举报