如何删除与目录中的模式匹配的文件

时间:2009-06-12 19:55:58

标签: delphi

即删除与给定目录中的模式匹配的所有文件

示例,删除DirectoryName中的所有* .jpg文件

3 个答案:

答案 0 :(得分:24)

procedure TForm1.Button1Click(Sender: TObject);
begin
  DeleteFiles(ExtractFilePath(ParamStr(0)),'*.jpg');
end;

procedure DeleteFiles(APath, AFileSpec: string);
var
  lSearchRec:TSearchRec;
  lPath:string;
begin
  lPath := IncludeTrailingPathDelimiter(APath);

  if FindFirst(lPath+AFileSpec,faAnyFile,lSearchRec) = 0 then
  begin
    try
      repeat
        SysUtils.DeleteFile(lPath+lSearchRec.Name);    
      until SysUtils.FindNext(lSearchRec) <> 0;
    finally
      SysUtils.FindClose(lSearchRec);  // Free resources on successful find
    end;
  end;
end;

答案 1 :(得分:5)

您可以使用SHFileOperation功能。使用SHFileOperation的好处是您可以选择将文件删除到回收站,并获得正常的API动画,以便用户知道发生了什么。缺点是删除比Jeff的代码需要更长的时间。

那里有几个包装纸。我使用BP Software的这个免费包装器。整个包装文件只有220行,易于阅读和使用。我不将其作为组件安装。我发现将此单元添加到项目中更容易,只需根据需要创建并释放对象。

更新:BP Software网站的下载链接不再有效。有older version on the Embarcadero website

  

TSHFileOp(1.3.5.1)(3 KB)
五月   作为包装的TComponent   要复制SHFileOperation API,   移动,重命名或删除(使用   recycle-bin support)文件系统   对象

SHFileOperation的文件名参数支持MS DOS样式通配符。所以你可以使用这样的组件:


      FileOps := TSHFileOp.Create(self);

      FileOps.FileList.Add(DirectoryName + '\*.jpg');

      FileOps.HWNDHandle := self.Handle;
      FileOps.Action := faDelete;
      FileOps.SHOptions :=
          [ofAllowUndo, ofNoConfirmation, ofFilesOnly, ofSimpleProgress];
      FileOps.Execute;

我通常会自己显示“你确定”的消息,所以我总是传递ofNoConfirmation标志,以便Windows不再询问。

如果您不想删除每个jpg文件或者您需要从多个目录中删除,您可以在调用execute之前将完整文件名或带有通配符的不同路径添加到FileList字符串列表中。

这是MSDN Page for SHFileOperation
请注意,从Windows Vista开始,SHFileOperation已被IFileOperation取代。我继续在Windows Vista上使用SHFileOperation而没有任何问题。

答案 2 :(得分:5)

在最近的Delphi版本中,您可能会使用System.IOUtils中的类,这些类基本上包裹FindFirstFindNext等:

procedure DeleteFilesMatchingPattern(const Directory, Pattern: string);
  var FileName: string;
begin
  for FileName in TDirectory.GetFiles(Directory, Pattern) do TFile.Delete(FileName);
end;