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

vol*_*vox 10 delphi

也就是说,删除与给定目录中的模式匹配的所有文件

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

Jef*_*tis 25

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;
Run Code Online (Sandbox Code Playgroud)

  • FindClose不应该在finally子句中吗? (2认同)

DNR*_*DNR 8

在较新版本的Delphi,你可能会使用的类System.IOUtils,它基本上包裹FindFirst,FindNext等:

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


Mar*_*der 5

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

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

更新:BP软件站点的下载链接不再有效.Embarcadero网站上有一个旧版本.

TSHFileOp(1.3.5.1)(3 KB)
2006年5月31日
TComponent是SHFileOperation API的包装器,用于复制,移动,重命名或删除(使用recycle-bin)文件系统对象.

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;
Run Code Online (Sandbox Code Playgroud)

我通常会自己显示"你确定"的消息,所以我总是传递ofNoConfirmation标志,这样Windows就不会再问了.

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

以下是SHFileOperationMSDN页面
请注意,从Windows Vista开始,SHFileOperation已被IFileOperation取代.我继续在Windows Vista上使用SHFileOperation没有任何问题.