delphi 删除指定目录 下 指定日期之前所有文件

时间:2021-10-22 14:07:08

前几天发现客户的 图片目录 已经超过 60G.。。。磁盘只有 63G.。。。

需要删除指定日期 之前的 所有 图片,保留最近20天左右的 图片

要是进目录来删,那是找死,虽然全部不是在同一个目录,但也有成千上万个子目录。找时间来删除肯定是白痴。

用bat?  虽然说可以,只不过,有时候删得相当离谱。

想来想去,只有弄个delphi exe来删除。 没想到,速度还蛮快的。又不卡。

delphi 删除指定目录 下 指定日期之前所有文件

 

程序界面简单如上

以下是相关源码 

 

function  tform1.listmypath(p:string;d:string):string;
var
  r:TsearchRec;
  ret:integer;
  ds,d1,d2,d3:string;
  cdt,chkd:Tdatetime;

begin
   ret:=findfirst(p+'\'+'*.*',faanyfile,r);
   while ret=0 do
   begin
      if r.attr=fadirectory then
      begin
        if (r.name<>'.') and (r.Name<>'..') then
        begin
          //logs.lines.add('正在进入目录:'+r.name+'进行文件检查....');
          listmypath(p+'\'+r.name,d);
        end;
      end
      else
      begin
         ds:=p+'\'+r.name;
         cdt:=GetFilesTime(ds, 0);
         chkd:=strtodatetime(d);

         d1:=datetostr(cdt);
         d2:=datetostr(GetFilesTime(ds, 1));
         d3:=datetostr(GetFilesTime(ds, 2));


         if cdt<chkd then
         begin
            application.ProcessMessages;
            abc.text:='正在删除文件:'+r.name+',创建时间:'+d1;
            tcount:=tcount+1;
            deletefile(ds);
         end;

      end;
      ret:=findnext(r);
   end;
   findclose(r);

end;

function tform1.GetFilesTime(sFilename: String; Timetype: Integer): TDateTime;
var
  ffd: TWin32FindData;
  dft: DWord;
  lft, Time: TFileTime;
  sHandle: THandle;
begin
  sHandle:= Windows.FindFirstFile(PChar(sFileName), ffd);
  if (sHandle <>INVALID_HANDLE_VALUE) then
    begin
      case Timetype of
        0: Time:= ffd.ftCreationTime;
        1: Time:= ffd.ftLastWriteTime;
        2: Time:= ffd.ftLastAccessTime;
      end;
    Windows.FindClose(sHandle);
    FileTimeToLocalFileTime(Time, lft);
    FileTimeToDosDateTime(lft, LongRec(dft).HI, LongRec(dft).Lo);
    Result:= FileDateToDateTime(dft);
  end else Result:= 0;
end;

procedure TForm1.btdelClick(Sender: TObject);
var
pat:string;
pad:string;

begin
   pat:=opa.Text;
   pad:=opd.Text; //用于比较的字符串。
   logs.clear;
   logs.lines.add('正在查询 目录下 '+pat+' 所有文件');
   if pad<>'' then
   begin
   listmypath(pat,pad);
   end;
   abc.text:='总计:'+inttostr(tcount)+'文件已删除!';
   
end;


大概思路是,递归进入各个子目录。如果是目录,则进去子目录。如果不是,则直接进行比较日期之后,进行删除操作。

 其中提取到 这个文件的准确创建日期这一块可能 费了点时间。就是不想直接用r.finddata 里头的东西。太烦人。

 也没有多少技术,就是方便我自己罢了。