Comment rechercher différents types de fichiers à l'aide de la méthode FindFirst?
Dans mon Application j'utilise la procédure suivante pour analyser récursivement n'importe quel dossier et sous-dossiers, si le dossier contient des Fichiers Texte (*.txt) j'ajoute le nom du fichier à un TStringList défini dans ma procédure:
procedure FileSearch(const PathName: string; var lstFiles: TStringList);
const
FileMask = '*.txt';
var
Rec: TSearchRec;
Path: string;
begin
Path := IncludeTrailingBackslash(PathName);
if FindFirst(Path + FileMask, faAnyFile - faDirectory, Rec) = 0 then
try
repeat
lstFiles.Add(Path + Rec.Name);
until FindNext(Rec) <> 0;
finally
FindClose(Rec);
end;
if FindFirst(Path + '*.*', faDirectory, Rec) = 0 then
try
repeat
if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name <> '.') and
(Rec.Name <> '..') then
FileSearch(Path + Rec.Name, lstFiles);
until FindNext(Rec) <> 0;
finally
FindClose(Rec);
end;
end;
Tout fonctionne parfaitement, mais je veux être capable de rechercher plusieurs extensions de fichier. J'ai essayé de modifier le FileMask pour ce faire, mais à chaque fois il ne retourne rien, probablement parce qu'il est à la recherche d'une extension non valide. J'ai essayé de chacun des éléments suivants, avec pas de chance: (essayé à un moment de toute évidence, je n'ai pas écrit les lignes ci-dessous 3 fois dans ma procédure)
FileMask = '*.txt|*.rtf|*.doc';
FileMask = '*.txt;*.rtf;*.doc';
FileMask = '*.txt,*.rtf,*.doc';
Je me sens bête de demander ça, mais comment puis-je autoriser le supplément des extensions de fichiers à inclure dans la recherche? Je peux le faire pour Ouvrir et Enregistrer des boîtes de dialogue, pourquoi ne peux-je séparer les extensions ici?
Grâce.
Craig.
OriginalL'auteur | 2011-05-13
Vous devez vous connecter pour publier un commentaire.
Changer votre fonction de sorte qu'il accepte une liste d'extensions ainsi, séparés par des points-virgules ou une autre délimiteur. Vous pouvez ensuite vérifier l'existence de chaque trouvé extension de fichier dans la liste des extensions, et si l'ajouter à votre stringlist.
Quelque chose comme cela devrait fonctionner:
Exemple d'appel:
PathMatchSpec dans AhLwApi peut-être un peu plus propre que AnsiPos. msdn.microsoft.com/en-us/library/bb773727%28v=vs.85%29.aspx
Tu veux dire Shlwapi? PathMatchSpec semble que cocher une seule extension à la fois, ce qui signifie que vous auriez à analyser la liste de vos extensions séparément pour tester. À l'aide de AnsiPos vous permet simplement de vérifier pour voir si l'un est dans la liste délimitée par des virgules. Si vous êtes inquiet au sujet de la casse, vous pouvez utiliser
AnsiContainsText
plutôt que; il effectue une casse de recherche et retourne un Booléen indiquant si la sous-chaîne existe ou pas.merci de fournir des informations supplémentaires
Oui, ShlwApi. PathMatchSpec deuxième paramètre accepte plusieurs point-virgule séparés des extensions de fichier.
OriginalL'auteur Ken White
En Delphi XE7 cette ligne de code génère (ligne 17) une erreur:
Pour corriger l'erreur j'ai juste supprimé
SysUtils.
à la lecture de ce code:Maintenant le code compile bien. Merci pour cette très utile, code et solution.
OriginalL'auteur Benoit Standaert