Liste de fichiers avec FindFirst

Signaler
Messages postés
77
Date d'inscription
lundi 17 octobre 2005
Statut
Membre
Dernière intervention
4 septembre 2008
-
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
-
Bonjour,
Voici un problème que je rencontre avec FindFirst.
J'ai écrit un code qui recherche si un fichier quelconque, ayant une extension particulière dans un répertoire donné, existe.
en gros voici la ligne de code

if FindFirst(Repertoire+'Outil\*.OUT',faAnyFile,Dirinfo)=0 then
begin
texte:=dirinfo.name;
etc....
end else message erreur ....

je pensais que cette fonction ne trouverais que les fichiers ayant une extension .OUT puisque dans le Path de findfirst j'ai mis *.OUT. Hors lorsque j'ai testé la fonction, j'avais dans le répertoire un seul fichier ABC.OUT. Findfirst me trouve bien le fichier. J'ai voulu ensuite testé l'affichage de mon message d'erreur, j'ai alors renommé le fichier ABC.OUT en ABC.OUT2
et là chose bizarre qui a sans doute une explication mais que je ne connais pas Findfirst ne m'affiche pas le message d'erreur mais fait comme ci il avait trouvé un fichier ayant l'extension .OUT alors qu'il n'y en a pas puisque le fichier s'appelle alors ABC.OUT2. En passant par le debugger la variable texte prend bien le nom du fichier ABC.OUT2 alors que cela ne devrait pas être possible. (findfirst avec une recherche *.OUT me fait en fait une recherche *.OUT*)
J'ai fait ensuite les mêmes tests mais en changeant l'extension des fichiers et de la recherche.
dans le répertoire j'ai mis un fichier et un seul ABC.OU et j'ai mis dans finsfirst *.OU
findfirst trouve le fichier => normal.
j'ai renommé le fichier en ABC.OU1 et là findfirst ne trouve plus de fichier *.OU et m'affiche le message d'erreur. Donc ici cela fonctionne comme je le souhaitais. Je me suis alors dit qu'au delà de 3 caractères après le point findfirst ne tient plus compte de rien. J'ai refais un test avec un fichier qui s'appelle ABC.OUTS et une recherche findfirst avec *.OUTS. Là findsfirst trouve le fichier => normal. J'ai renommé le fichier en ABC.OUTS1 et là mon message d'erreur s'affiche, findfirst ne trouve pas de fichier. Cela fonctionne comme cela devrait.

2 questions:
Pourquoi findfirst ne fonctionne pas correctement lorsque je fais une recherche avec 3 caractères après le point?

Peut être que findfirst a une origine dos, dans ce cas y a t-il une fonction identique à findfirst mais qui gère les noms dit long?

Merci de vos réponses

8 réponses


Salut


Findfirtst est une synthaxe Pascal et non Delphi.

Autre point, le problème ne vient pas du nombre de caractères après l'extension : la preuve tu as fait un test et cela marche. Alors d'ou vient l'erreur ?? déjà il faudrait le code dans son ensemble pour dire. Ensuite as tu fermé ton application avec ton test pour ABC.OUT2
? Sinon fais un test avec ABC.OUT puis ferme l'appli. Créer ABC.OUT2 puis FERME LE et relance ton appli et regarde ce que tu obtients.

Bon Prog a+
Messages postés
77
Date d'inscription
lundi 17 octobre 2005
Statut
Membre
Dernière intervention
4 septembre 2008

Salut,
Pour être sur que je n'ai pas un bug caché dans mon programme, j'en ai fait un autre avec seulement les instructions suivante. Je n'ai qu'une fiche avec un bouton
voici le programme:

procedure TForm1.Button1Click(Sender: TObject);
var Dirinfo:TSearchRec;
texte:String;
begin
if FindFirst('D:\Mes Documents\*.OUT',faAnyFile,Dirinfo)=0 then
begin
Texte:=Dirinfo.Name;
MessageDlg('je vois le fichier Outil: '+Texte,mtInformation,[mbOK],0)
end else MessageDlg('je ne vois pas le fichier Outil',mtError,[mbOK],0);
end;

j'ai refais tous les tests précedents, en fermant et en relançant l'application j'ai toujours ce phénomène. Que mon fichier s'appelle ABC.OUT ou ABC.OUT2 ou même ABC.OUT2222222222, j'ai toujours le message "je vois le fichier outil ABC.OUT ou OUT2 ou OUT2222222222"
Findfirst me fait une recherche de type *.OUT* au lieu de *.OUT
(j'utilise delphi6 perso mais même la version 2005 perso c'est pareil)


Findfirst est une syntaxe pascal et non delphi. Qu'elle est la syntaxe équivalente en delphi?

Salut

Delphi est l'hériier du Pascal : donc tu peux utiliser findfirst. Maintenant est ce qu'il y a une traduction spéciale pour delphi, je ne crois pas.

Ce que je te conseille, c'est de regarder sur Google les paramêtres de Findfirst. Sache aussi qu'il exite des fonctions nextfind ect ect. En cherchant je pense que tu trouveras le pk du comment ? (désolé je n'ai pas Delphi sous les yeux d'ou ma réponse).

Allez accroche toi

Bonne prog. :)
Messages postés
77
Date d'inscription
lundi 17 octobre 2005
Statut
Membre
Dernière intervention
4 septembre 2008

Merci francky, je vais explorer le net et essayer de trouver le pourquoi de cette anomalie et si je trouve je mettrais la réponse.

Regarde : http://pascal.developpez.com/faq/?page=Pg_FAQ_Files#FichierExiste

Je pense que tu va trouver ton bonheur

Salut
Messages postés
77
Date d'inscription
lundi 17 octobre 2005
Statut
Membre
Dernière intervention
4 septembre 2008

oui je l'avais trouvé cette page là. mais elle concerne le langage pascal pas delphi. Et je ne vois pas où est mon problème car ma structure findfirst est
correct.

j'ai ecrit le programme en turbo pascal. j'ai le même problème mais là c'est normal car turbo pascal ne gère pas les noms longs c'est pour cela que ta page propose une unité pour gérer les noms longs (et je n'ai plus envi de programmer en Turbo pascal)


Je peux toujours testé le nom du fichier que findfirst me renvoi et ça resoudra mon problème. Mais c'est le pourquoi qui m'interresse.

merci de ton aide.
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
33
Procedure FilesSearch(const path,extention : string;) : TStringList;

var sr : TSearchRec;

begin

// on Findfirstise

FindFirst(path+'\*'+extention,faAnyFile,sr);

// on commence la recherche

while FindNext(sr) = 0 do begin

// si on trouve un elements

if pos(extention, sr.Name) = (length(sr.Name)-length(extention)) then

// on l'ajoute a la liste

result.Add(sr.Name);

end;

// on ferme SR

FindClose(sr);

end;
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
33
Ah zut j'ai oublier,



tu peu egalement utiliser la fonction

FileExist(filename : string) : boolean



pour tester si un fichier existe...