2009-06-12 3 views
9

C'est, supprimer tous les fichiers qui correspondent au motif dans un répertoire donnéComment supprimer des fichiers qui correspondent au motif dans un répertoire

Exemple, Supprimer tous les fichiers * .jpg dans les DirectoryName

+0

Vous pouvez utiliser une expression régulière. Faites des recherches sur Googling, RegEx n'est pas ma spécialité, mais ils sont puissants comme l'enfer. –

+2

(Les fichiers apis ne supportent généralement pas les regex, juste les caractères génériques, la regex complète est plus quelque chose pour les shells et les langages de script) –

Répondre

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

(Il n'est pas nécessaire de remplir le lsearchrec) –

+0

Merci à tous. C'est exactement ce que je cherche. – volvox

+0

* Toujours * faire un FillChar si vous voulez programmer correctement. Cela peut ne rien faire, mais c'est une bonne habitude à garder. Un jour, si vous programmez en C comme je l'ai fait, vous aurez de gros ennuis si vous n'avez pas de bonnes habitudes. Vous devez * toujours * supposer que l'enregistrement n'est pas initialisé et vous devez * toujours * imaginer que la mémoire ne soit pas toujours définie avec 0 octet. Vous devez vraiment replacer la fonction FillChar pour montrer aux autres les bonnes habitudes plutôt que les mauvaises. –

5

Vous pouvez utiliser le SHFileOperation fonction. La bonne chose à propos de l'utilisation de SHFileOperation est que vous avez la possibilité de supprimer les fichiers dans la corbeille et vous obtenez les animations API normales afin que l'utilisateur sache ce qui se passe. L'inconvénient est que la suppression prendra un peu plus de temps que le code de Jeff.

Il existe plusieurs wrappers. J'utilise cette enveloppe gratuite de BP Software. L'ensemble du fichier wrapper ne contient que 220 lignes et est facile à lire et à utiliser. Je n'installe pas cela en tant que composant. J'ai trouvé plus facile d'ajouter cette unité à mon projet et juste de créer et libérer l'objet au besoin.

Mise à jour: Le lien de téléchargement du site BP Software n'est plus valide. Il y a un older version on the Embarcadero website.

TSHFileOp (1.3.5.1) (3 KB)
mai 31, 2006
TComponent qui est un wrapper pour l'API SHFileOperation pour copier, déplacer, renommer ou supprimer (avec support de la Corbeille) un système de fichiers objet.

Le paramètre de nom de fichier pour SHFileOperation prend en charge les caractères génériques de style MS-DOS. Ainsi, vous pouvez utiliser le composant comme ceci:


     FileOps := TSHFileOp.Create(self); 

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

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

Je montre généralement le « Êtes-vous sûr » un message moi-même si je passe toujours le drapeau de ofNoConfirmation si Windows ne demande pas de nouveau. Si vous ne voulez pas supprimer chaque fichier jpg ou si vous devez supprimer de plusieurs répertoires, vous pouvez ajouter des noms de fichiers complets ou des chemins différents avec des caractères génériques à la liste de chaînes FileList avant d'appeler execute.

Voici la MSDN Page for SHFileOperation
Notez que SHFileOperation a été remplacé par IFileOperation à partir de Windows Vista. J'ai continué à utiliser SHFileOperation sur Windows Vista sans aucun problème.

+0

Merci cette autre solution juste et doc - je l'ai essayé avec le wrapper TSHFileOp. – volvox

+0

Le lien est mort ... – kobik

4

Dans les versions plus récentes de Delphi, vous utiliserez probablement les classes System.IOUtils qui achevons essentiellement FindFirst, FindNext etc:

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