2009-06-12 80 views
9

也就是说,删除指定目录目录中的匹配模式如何删除文件

例中的匹配模式的所有文件,删除内的DirectoryName

所有* .jpg文件
+0

你可以使用正则表达式。做一些Google模式匹配,RegEx不是我的专长,但他们是强大的地狱。 – 2009-06-12 20:05:24

+2

(文件API通常不支持正则表达式,只是普通的通配符。完整的regex是外壳和脚本语言更多的东西) – 2009-06-12 20:42:57

回答

22
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; 
+0

(有没有必要fillchar的lsearchrec)所有 – 2009-06-12 20:46:10

5

您可以使用SHFileOperation功能。关于使用SHFileOperation的好处是,你必须将文件删除到回收站的选项,你会得到正常的API动画,这样用户就知道是怎么回事。缺点是删除将比Jeff的代码稍长一些。

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

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

TSHFileOp(1.3.5.1)(3 KB) 31日,2006年
TComponent是一个包装 为SHFileOperation API复制, 移动,重命名或删除(有 回收斌支持
五月)文件系统 对象。

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之前,外卡添加完整的文件名或不同的路径。

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

4

在较新版本的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; 
相关问题