Übersicht Tipp der Woche    Übersicht multifile    Neues in multifile


Tipp der Woche KW 9/2002


Ordner durchsuchen (1)

Dateien innerhalb der multifile-Programmierung zu erstellen, sie zu verändern oder gar zu löschen, stellt in der Regel kein Problem dar. Zuständig hierfür sind die Funktionen und Prozeduren, die mit dem Kürzel "FIO" (File-In-Out = Datei-Ein-Ausgabe) beginnen.
Wenn es jedoch darum geht, Ordner nach bestimmten Dateien zu durchsuchen, schrecken viele ab. Der Grund: Eine offenbar furchteinflößende Variable vom Typ TSearchRec.
Wir möchten an dieser Stelle für Aufklärung sorgen und besprechen den Vorgang des Durchsuchens von Ordnern sehr genau. Dabei wird diese Woche erläutert, welche Vorüberlegungen getroffen werden müssen, während nächste Woche der eigentliche Suchvorgang beschrieben wird.

Vorbereitungen
Wer Ordner durchsuchen möchte, muss lediglich vier Dinge berücksichtigen.
1.: Eine Variable vom Typ TSearchRec deklarieren
2.: Überlegen, welcher Ordner durchsucht werden soll.
3.: Überlegen, mit welcher Namensmaske die gesuchten Dateien ermittelt werden können.
4.: Überlegen, welche Datei-Attribute in Frage kommen können.

1. Die Deklaration
Wir nennen unsere Prozedur "Suche" und deklarieren die Variable tsr:

PROCEDURE Suche ;
VAR
  tsr : TSearchRec ;
BEGIN
END ;


2. Durchsuchter Ordner
Wir gehen in dem Beispiel davon aus, dass der Temp-Ordner der lokalen multifile-Installation durchsucht werden soll. Mit den Funktionen ProgPath und TempPath kann dieser Pfad zusammengesetzt werden. Das Ergebnis legen wir in die noch zu deklarierende Variable ordner ab:

PROCEDURE Suche ;
VAR
  tsr    : TSearchRec ;
  ordner : STRING ;
BEGIN
  // Zu durchsuchenden Ordner festlegen
  ordner := ProgPath + TempPath ;
END ;


3. Namensmaske festlegen
Welche Dateien innerhalb des Ordners gefunden werden, hängt auch von der Suchmaske ab, die dem Suchalgorithmus mitgeteilt wird. Die Suchmaske entspricht den üblichen DOS-Namensmasken, die im DIR-Befehl verwendet werden. So steht das Zeichen '?' für genau ein beliebiges Zeichen, während '*' für beliebig viele Zeichen steht. In unserem Fall möchten wir alle Dateien suchen, die die Namenserweiterung 'TXT' besitzen. Die Namensmaske lautet daher '*.TXT'. Die Maske legen wir in der noch zu deklarierenden Variablen namens maske ab:

PROCEDURE Suche ;
VAR
  tsr    : TSearchRec ;
  ordner : STRING ;
  maske  : STRING ;
BEGIN
  // Zu durchsuchenden Ordner festlegen
  ordner := ProgPath + TempPath ;
  // Such-Namensmaske festlegen
  maske := '*.TXT' ;
END ;


4. Attribute festlegen
Dateien können verschiedene Attribute besitzen. Das wohl am häufigsten anzutreffende Attribut ist das Archiv-Attribut. Es besagt, dass die Datei seit der Erstellung irgendwann einmal im Inhalt verändert wurde. Ursprünglich wurde dieses Attribut für Datensicherungen erfunden. Datensicherungen durchsuchten alle Laufwerke nach Dateien mit Archiv-Attribut, sicherten sie und entfernten das Attribut. Das Betriebssystem setzt das Attribut automatisch wieder neu, wenn die Datei eine Änderung erfährt.
Ein weiteres Attribut heißt ReadOnly. Es bewirkt, dass die Datei zwar gelesen, nicht aber überschrieben werden kann. Aus diesem Grund lassen sich solche Dateien auch nicht mit der Funktion FIOOpen öffnen. Diese Funktion öffnet Dateien nämlich zum Lesen und Schreiben.
Das Attribut Hidden "versteckt" die Datei. Ein regulärer DIR-Befehl unter DOS würde eine soche Datei nicht auflisten.
Das Attribut Sys wurde für System-Dateien eingeführt. Es soll dem Anwender deutlich machen, dass derartige Dateien Bestandteil des Betriebssystemes oder einer Anwendung sind und daher keinesfalls umbenannt, verschoben oder gar gelöscht werden dürfen.
Das Attribut VolumeID findet man pro Laufwerk typischerweise nur einmal. Es bewirkt, dass der Name der Datei sozusagen der Name des Laufwerkes ist. Öffnen Sie einmal die Auswahl "Arbeitsplatz" auf dem Windows-Desktop und betrachten Sie die Bezeichnungen der angebotenen Laufwerke. Dort findet man möglicherweise "Windows 2000 (C:)". Das bedeutet, dass das Laufwerk C: die Bezeichnung "Windows 2000" trägt. Klicken Sie mit der rechten Maustaste auf das Laufwerkssymbol und wählen Sie "Eigenschaften". Dort lässt sich eine Bezeichnung vergeben. Was aber tatsächlich passiert, wenn eine Bezeichnung vergeben wird, ist folgendes: Es wird eine Datei auf dem Root (Hauptordner) des Laufwerkes erstellt, die exakt den Namen trägt, der soeben angegeben wurde. Zudem erhält diese Datei das Attribut VolumeID. Das ist übrigens auch der Grund, weshalb die Zeichen '*', '?', '/' oder '\' in der Bezeichnung nicht vorkommen dürfen.
Als letztes Attribut bleibt noch Directory. Dabei handelt es sich nicht wirklich um eine Datei, sondern um einen Ordner! Auch diese lassen sich also finden, wenn ein Ordner durchsucht wird.

Um den Umgang mit den Attributen zu vereinfachen, wurden Konstanten eingeführt, die die Festlegung der erlaubten Attribute vereinfacht. Die nachstehende Tabelle weist alle verfügbaren Konstanten aus:

Konstante Wert Beschreibung
faReadOnly $01 Schreibgeschützte Dateien
faHidden $02 Versteckte Dateien
faSysFile $04 Systemdateien
faVolumeID $08 Laufwerksbezeichner
faDirectory $10 Verzeichnisse
faArchive $20 Archivdateien
faAnyFile $39 Alle Dateien

In unserem Beispiel sollen alle Dateien, nicht aber die VolumeID ausgewertet werden. Da wir nicht die Root auslesen, können wir daher faAnyFile verwenden. Wir wollen aber genau sein und sparen faVolumeID dennoch aus. Zudem interessieren Unterordner nicht, weshalb auch der Wert faDirectory ausgenommen wird. Das Resultat wird zunächst in der Variablen attr festgehalten:

PROCEDURE Suche ;
VAR
  tsr    : TSearchRec ;
  ordner : STRING ;
  maske  : STRING ;
  attr   : INTEGER ;
BEGIN
  // Zu durchsuchenden Ordner festlegen
  ordner := ProgPath + TempPath ;
  // Such-Namensmaske festlegen
  maske := '*.TXT' ;
  // Attribute festlegen
  attr := faAnyFile - faVolumeID - faDirectory ;
END ;


Die Vorüberlegungen sind damit abgeschlossen.

Nächste Woche wird der eigentliche Suchvorgang erläutert.

  Tipp 8/2002 Tipp 10/2002  

© 2002 IAS GmbH, Berlin