Recherche d'un fichier
Remonter à Manipulation de fichiers
Il existe trois routines utilisées pour rechercher un fichier :
- FindFirst recherche la première instance d’un nom de fichier ayant un ensemble spécifié d’attributs dans un répertoire spécifié.
- FindNext renvoie l’entrée suivante correspondant au nom et aux attributs spécifiés dans un appel précédent de FindFirst.
- FindClose libère la mémoire allouée par FindFirst. Vous devez toujours utiliser FindClose pour clore une séquence FindFirst/FindNext.
- Si vous voulez simplement savoir si un fichier existe, la fonction FileExists renvoie true si le fichier existe, false sinon.
Les trois routines acceptent un TSearchRec en tant que l'un des paramètres. TSearchRec définit les informations de fichier recherchées par FindFirst ou FindNext. TSearchRec a la déclaration suivante :
Delphi :
type
TFileName = string;
TSearchRec = record
Time: Integer;//Time contains the time stamp of the file.
Size: Integer;//Size contains the size of the file in bytes.
Attr: Integer;//Attr represents the file attributes of the file.
Name: TFileName;//Name contains the filename and extension.
ExcludeAttr: Integer;
FindHandle: THandle;
FindData: TWin32FindData;//FindData contains additional information such as
//file creation time, last access time, long and short filenames.
end;
C++ :
struct TSearchRec
{
int Time; // time stamp of the file
int Size; // size of the file in bytes
int Attr; // file attribute flags
AnsiString Name; // filename and extension
int ExcludeAttr; // file attribute flags for files to ignore
unsigned FindHandle;
_WIN32_FIND_DATAA FindData; // structure with addition information
};
Si un fichier est trouvé, les champs du paramètre de type TSearchRec sont modifiés pour décrire le fichier trouvé. L'un des champs de TSearchRec présente un intérêt particulier, c'est le champ Attr. Vous pouvez comparer Attr aux constantes ou valeurs d’attributs suivantes pour déterminer si un fichier possède un attribut donné :
Constantes et valeurs d’attributs
Constante | Valeur | Description |
---|---|---|
faReadOnly |
$00000001 |
Fichiers en lecture seule |
faHidden |
$00000002 |
Fichiers cachés |
faSysFile |
$00000004 |
Fichiers système |
faVolumeID |
$00000008 |
Fichiers d’identification de volume |
faDirectory |
$00000010 |
Fichiers répertoire |
faArchive |
$00000020 |
Fichiers archive |
faAnyFile |
$0000003F |
Tous les fichiers |
Pour tester un attribut, combinez la valeur du champ Attr avec la constante d’attribut à l'aide de l’opérateur and. Si le fichier a cet attribut, le résultat est supérieur à 0. Par exemple, si le fichier trouvé est un fichier caché, l’expression suivante a la valeur True :
Delphi :
(SearchRec.Attr and faHidden > 0).
C++ :
(SearchRec.Attr & faHidden > 0)
Il est possible de combiner les attributs en associant avec l’opérateur OR leurs constantes ou valeurs. Par exemple, pour rechercher, outre les fichiers normaux, les fichiers accessibles en lecture uniquement ainsi que les fichiers cachés, vous devez transmettre la syntaxe suivante comme paramètre Attr :
(faReadOnly or faHidden).
C++ :
(faReadOnly | faHidden)
Exemple
L'exemple suivant utilise une fiche contenant un libellé, un bouton nommé Search et un bouton nommé Again. Quand l’utilisateur clique sur le bouton Search, le premier fichier du répertoire spécifié est trouvé et son nom et sa taille en octets sont affichés dans l’intitulé du libellé. A chaque fois que l’utilisateur clique sur le bouton Again, le nom et la taille du fichier correspondant suivant sont affichés dans le libellé :
Delphi :
var SearchRec: TSearchRec;
procedure TForm1.SearchClick(Sender: TObject);
begin
FindFirst('c:\Program Files\MyProgram\bin\*.*', faAnyFile, SearchRec); Label1.Caption := SearchRec.Name + ' is ' + IntToStr(SearchRec.Size) + ' bytes in size';
end;
procedure TForm1.AgainClick(Sender: TObject);
begin
if FindNext(SearchRec) = 0 then
Label1.Caption := SearchRec.Name + ' is ' + IntToStr(SearchRec.Size) + ' bytes in size'
else
FindClose(SearchRec);
end;
C++ :
TSearchRec SearchRec; // global variable
void __fastcall TForm1::SearchClick(TObject *Sender) {
FindFirst("c:\\Program Files\\bcb6\\bin\\*.*", faAnyFile, SearchRec);
Label1->Caption = SearchRec->Name + " is " + IntToStr(SearchRec.Size) +
" bytes in size";
}
void __fastcall TForm1::AgainClick(TObject *Sender) {
if (FindNext(SearchRec) == 0)
Label1->Caption = SearchRec->Name + " is " + IntToStr(SearchRec.Size) +
" bytes in size";
else
FindClose(SearchRec);
}
Remarque : Dans les applications multiplates-formes ou multi-périphériques, vous devez remplacer les chemins d'accès codés en dur par le chemin d'accès correct du système, ou les représenter en utilisant des variables d'environnement (énumérées sur la page Variables d'environnement ; choisissez Outils > Options > Options d'environnement > Variables d'environnement.