即删除与给定目录中的模式匹配的所有文件
示例,删除DirectoryName中的所有* .jpg文件
答案 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
中的类,这些类基本上包裹FindFirst
,FindNext
等:
procedure DeleteFilesMatchingPattern(const Directory, Pattern: string);
var FileName: string;
begin
for FileName in TDirectory.GetFiles(Directory, Pattern) do TFile.Delete(FileName);
end;