Recherche d'un fichier

De Appmethod Topics
Aller à : navigation, rechercher

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 :

Object Pascal :

  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 :

Object Pascal :

  (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é :

Object Pascal :

 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.

Voir aussi