Thema: Delphi FindFirst, FindNext

Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.107 Beiträge
 
Delphi 11 Alexandria
 
#3
  Alt 7. Jan 2003, 00:01
Moin Nailor,

die Suchmaske *.* bedeutet:
Suche nach allen Dateinamen (erster *) und allen Endungen (.*)
Anders formuliert: Suche nach allem.
Logisch, dass dann auch alles zurückgeliefert wird.

Die Suche nur nach Dateien sollte so gehen

FindFirst('*.*',faAnyFile and not faDirectory,dat) Schau Dir dazu mal am besten die möglichen Werte für faXXXX in der Hilfe an. Wichtig: Bei solchen Werten (Flags) immer mit or zusammenfügen und mit and not löschen niemals mit +/-. Das würde zwar meist gutgehen, muss es aber nicht, da diese Konstanten Bitmuster enthalten und somit auch, wenn man es nicht erwartet, einen negativen Wert enthalten können, so dass aus der Subtraktion unerwartet eine Addtion wird. Kann interessante Probleme zur Folge haben.

Ich für meinen Teil suche immer erst mal nach allem (faAnyFile) und filtere dann hinterher (z.B. if (dat.Attr and faDirectory) = 0 then, wenn ich Directories herausfiltern will), da ich den FindFirst Filtern bei der Abfrage nicht so recht traue
Ist aber bestimmt Geschmackssache.

Den Eintrag .. gibt es durch aus. Ebenso auch den Eintrag .
Nach diesem beiden wird man immer Filtern müssen, denn sie werden wohl auch immer auftauchen (zumindest bei *.*)

Mit .. kann man zum übergeordneten Verzeichnis verzweigen, mit . ist das aktuelle Verzeichnis gemeint.
Mach am besten mal eine Konsole auf und lass Dir mal mit DIR den Verzeichnis inhalt anzeigen.
Dabei werden . und .. auch angezeigt (als erstes)
Ein leeres Verzeichnis enthält dann auch nur diese beiden.

Wenn Du in einem Unterverzeichnis mal Dir .. eingibst erhältst Du den Inhalt des übergeorneten Verzeichnisses, mit Dir . das gleiche wie mit Dir und Dir *.*.

Die Abfrage müsste also lauten:
Delphi-Quellcode:
if (dat.name <> '.') and (dat.name <> '..') then
begin
  // Mach was mit dem gefundenen Namen
end;
Ach ja:
Nicht mit dat.name[1] <> '.' abfragen.
Punkte sind in Datei und Verzeichnisnamen zugelassen, auch als erstes Zeichen, und somit können einem Dateien/Verzeichnisse entgehen.

Nachtrag:
Du kannst bei FindFirst auch einen kompletten Startpfad für die Suche angeben, und brauchst diesen nicht mit SetCurrentDirectory zu setzen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat