Dateien suchen

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Dateien bearbeiten

Es gibt drei Routinen zum Suchen von Dateien:

  • FindFirst sucht die erste Instanz eines Dateinamens mit den angegebenen Attributen im angegebenen Verzeichnis.
  • FindNext gibt die nächste Fundstelle zurück, die den in einem vorhergehenden Aufruf von FindFirst angegebenen Namen (und Attributen) entspricht.
  • FindClose gibt den von FindFirst zugeordneten Speicher frei. Sie sollten FindClose immer verwenden, um FindFirst/FindNext-Operationen abzuschließen.
    • Das Vorhandensein einer Datei können Sie mit der Funktion FileExists ermitteln. Diese Funktion gibt true zurück, wenn die Datei vorhanden ist, andernfalls false.

Alle drei Routinen übernehmen TSearchRec als einen ihrer Parameter. TSearchRec definiert die zu suchenden Dateiinformationen für FindFirst und FindNext. Die Deklaration von TSearchRec lautet:

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
 };

Wird eine Datei gefunden, nehmen die Felder des TSearchRec-Parameters die Daten zu dieser Datei auf. Das Feld Attr des TSearchRec-Parameters ist besonders wichtig. Attr kann für die folgenden Attributkonstanten oder Werte geprüft werden, um festzustellen, ob eine Datei über ein bestimmtes Attribut verfügt:

Attributkonstanten und Werte

Konstante Wert Beschreibung

faReadOnly

$00000001

Schreibgeschützte Dateien

faHidden

$00000002

Verborgene Dateien

faSysFile

$00000004

Systemdateien

faVolumeID

$00000008

Laufwerks-ID-Dateien

faDirectory

$00000010

Verzeichnisdateien

faArchive

$00000020

Archivdateien

faAnyFile

$0000003F

Beliebige Datei


Um den Wert eines Attributes abzufragen, können Sie den Wert im Feld Attr mithilfe des Operators and mit der Attributkonstanten kombinieren. Besitzt die Datei das angegebene Attribut, ist das Ergebnis größer als 0. Wenn es sich bei der gefundenen Datei beispielsweise um eine verborgene Datei handelt, dann wird der folgende Ausdruck zu True ausgewertet:

Object Pascal:

(SearchRec.Attr and faHidden > 0).

C++:

 (SearchRec.Attr & faHidden > 0)

Attribute können kombiniert werden, indem ihre Konstanten bzw. Werte mit OR verknüpft werden. Um neben normalen nach schreibgeschützten und verborgenen Dateien zu suchen, übergeben Sie die folgenden Werte im Parameter Attr.

Object Pascal:

(faReadOnly or faHidden).

C++:

 (faReadOnly | faHidden)

Beispiel

In diesem Beispiel werden eine Beschriftung (Label) sowie zwei Schaltflächen namens Search und Again in einem Formular verwendet. Wenn der Benutzer auf die Schaltfläche Search klickt, wird die erste Datei im angegebenen Pfad gesucht. Der Name und die Größe dieser Datei werden dann in der Beschriftung angezeigt. Immer wenn der Benutzer auf die Schaltfläche Again klickt, werden der Dateiname und die Größe der nächsten gefundenen Datei angezeigt:

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);
 }

Hinweis: Bei der Entwicklung plattformübergreifender oder geräteübergreifender Anwendungen sollten Sie direkte Dateiangaben durch Pfadnamen für das System ersetzen oder sie durch Umgebungsvariablen (auf der Seite Umgebungsvariablen unter Tools > Optionen > Umgebungsoptionen) darstellen.

Siehe auch