Dateien suchen
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:
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
};
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:
Delphi:
(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.
Delphi:
(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:
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);
}
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.