Über Pfade im allgemeinen ... und die Dateiauswahlbox im besonderen

Der ST verfügt über eine hierarchische Dateistruktur, die leider nicht häufig ausgenutzt wird. Dafür gibt es aber viele Programme, die von falschen Voraussetzungen ausgehen. Bitte legen Sie den Artikel nicht gleich beiseite, wenn Sie meinen, bereits alles zu wissen.

Um einmal ein Beispiel zu geben. Programmierer Hubert Sorglos (Ähnlichkeiten mit lebenden Personen wären rein zufällig) schreibt sein Programm. Er verfügt über ein Diskettenlaufwerk, startet sein Programm immer vom obersten Verzeichnis - dem Wurzelverzeichnis -aus und sieht daher nur Pfade der Form A:\DATEI_XY.PRG vor. Dabei kommt er nie auf den Gedanken, daß es auch Leute gibt, die ein zweites Laufwerk oder gar eine Festplatte besitzen und sein Programm von einem anderen Laufwerk aus starten oder in einem Ordner verstecken. Nur leider läuft das Programm von Hubert Sorglos unter den zuletzt genannten Voraussetzungen nicht. (Als Besitzer einer Festplatte kann ich ein Lied davon singen.)

Was tun? Zuerst möchte ich die Pfadnamen erklären. Ein vollständiger absoluter Pfadname hat beispielsweise die Form A:\ORDNER.1\ORDNER.2\DATEI.TXT. Hierbei gibt A:\ das Laufwerk an, ORDNER.1\ einen Ordner auf der obersten Ebene und ORDNER.2\ einen Ordner eine Ebene tiefer. In dem Ordner ORDNER.2 befindet sich nun die Datei DATEI.TXT. Absoluter Zugriff bedeutet, daß die Datei DATEI.TXT nur unter dem Pfad A:\ORDNER.1\ORDNER.2\ zu finden ist. Kopiert man sie an eine andere Stelle, ist sie nicht mehr aufzufinden.

Weiterhin besteht die Möglichkeit, einen relativen Pfadnamen anzugeben. Wird die Datei DATEI.TXT unter dem recht kurzen Pfadnamen DATEI.TXT gesucht, bedeutet das, daß das aktuelle Verzeichnis auf dem aktuellen Laufwerk benutzt wird. Aber es können auch Ordner vorangestellt werden. Unter Angabe von ORDNER.1\DATEI.TXT wird die Datei DATEI.TXT ausgehend vom aktuellen Verzeichnis im Ordner ORDNER. 1 gesucht. Gibt man ..\DATEI.TXT an, wird sie in der Ebene über dem aktuellen Verzeichnis gesucht.

So, nun hätten wir absolute und relative Pfadnamen. Um nun Unabhängigkeit vom Laufwerk zu erreichen, ist es ratsam, als Laufwerk dasjenige zu wählen, von dem aus das Programm gestartet wurde. Ebenso ist bei dem restlichen Pfad zu verfahren. Das TOS stellt hierzu die Funktionen Dsetdrv (Gemdos 14), Dgetdrv (Gemdos 25), Dsetpath (Gemdos 59) und Dgetpath (Gemdos 71) zur Verfügung. Dsetdrv setzt das aktuelle Laufwerk, Dgetdrv fragt ab, welches Laufwerk aktuell ist, Dsetpath setzt den aktuellen Zugriffspfad, und Dgetpath fragt ihn ab. Damit hat man vier Funktionen parat, die zur Einrichtung individueller Pfadnamen benutzt werden können.

Das wär’s zum Aufbau von Pfadnamen. Alle Programmiererinnen und Programmierer mögen doch bitte in Zukunft beachten, daß es immer wieder Leute gibt, die ihre Programme von den unterschiedlichsten Laufwerken oder aus tief verschachtelten Ordnern heraus starten!

Doch nun zur Dateiauswahlbox. Gerade hier ist die Zusammenstellung von Pfadnamen von besonderem Interesse. Zu den Betriebssystemroutinen gehört auch fsel_input (AES 90), also unsere bekannte Dateiauswahlbox oder auch in ST-computersprache - die Fileselectorbox. Der Routine fsel_input werden die zwei Zeichenketten fs_iinpath und fs_iinsel sowie der Integer-Wert fs_iexbutton übergeben.

Daher lautet die Definition in:

Turbo C:

int fsel_input (char *fs_iinpath, char *fs_iinsel, int *fs_iexbutton);

Megamax Modula 2:

PROCEDURE SelectFile(VAR path, name:ARRAY OF CHAR;VAR ok :BOOLEAN);

SPC Modula 2:

PROCEDURE FileSelectorInput (VAR path,selection :ARRAY OF CHAR; VAR OkNotCancel: BOOLEAN);

ST Pascal Plus:

FUNCTION Get_In_File (VAR PFAD,NAME:Path_Name):BOOLEAN;

Hier sollen die C-Deklarationen benutzt werden, fs_iinpath beinhaltet den Zugriffspfad (mit Wildcard), der unter dem Wörtchen INDEX erscheint, fs_iinpath einen Dateinamen, der bei AUSWAHL vorgegeben wird. In fs_iexbutton wird zurückgeliefert, ob OK oder ABBRUCH angeklickt wurde, aber dies soll uns hier nicht weiter interessieren. Auch der Dateiname spielt hier keine wichtige Rolle, dafür aber der Zugriffspfad.

Als Zugriffspfad sollte man immer einen vollständigen benutzen, also mit Laufwerksbezeichnung! Auf keinen Fall darf fest auf Laufwerk A zugegriffen werden, wie es unser Hubert Sorglos machen würde. Folglich ist mit Dgetdrv das aktuelle Laufwerk abzufragen oder ein Zugriffspfad aus einer programmspezifischen Parameterdatei zu wählen. Der Zugriffspfad sollte nur einmal zusammengestellt werden. Verändert der Programmbenutzer den Pfad, so ist es wichtig, dies zu berücksichtigen. Wer möchte schon immer wieder Ordner für Ordner öffnen, um eine Datei aus der sechsten Ebene aufzurufen! Die Berücksichtigung eines vom Benutzer veränderten Pfadnamens wird dadurch erreicht, daß der via fs_iinpath übergebene Pfad als globale Variable deklariert wird.

Warum aber den Laufwerksbuchstaben angeben? Ohne wird doch automatisch das aktuelle Laufwerk benutzt? Der Laufwerksbuchstabe dient der Information. Immerhin ist es unter den aktuellen TOS-Versionen möglich, bis zu 16 Laufwerke anzumelden. Ohne Laufwerksbuchstaben taucht schnell die Frage auf, von welchem Laufwerk die Dateien stammen.

Keine Regel ohne Ausnahme. Trotz relativer und absoluter Pfadnamen mit aktuellem Laufwerk und allem anderen, was dazugehört, gibt es einen (und nur einen) wirklich festen Zugriffspfad, den der Scrap-Ablage. Die beiden Routinen SCRP_READ (AES 80) und SCRP_WRITE (AES 81) lesen bzw. setzen den Zugriffspfad für das aktuelle Scrap-Verzeichnis. Dieser Pfad setzt sich standardmäßig aus dem Laufwerksbuchstaben des Bootlaufwerks und dem Ordner SCRAPDIR sowie der Maske SCRAP.* zusammen. Bei Festplattenbetrieb sähe der Pfad etwa so aus: C:\SCRAPDIR\SCRAP.*. Großartige Änderungen an diesem Pfad sollte man auf keinen Fall anbringen. Ebenso dürfen die beiden genannten AES-Funktionen nicht zweckentfremdet werden, den es gibt mittlerweile einige Programme, die diese Funktionen benutzen.

Literatur:

[1] Atari ST Profibuch, Hans-Dieter Jankowski/Julian F. Reschke/Dietmar Rabich, 6. Auflage 1989, Sybex-Verlag, Düsseldorf, ISBN 3-88745-563-0

[2] Scheibenkleister, Claus Brod/ Anton Stepper, 1. Auflage 1988, Maxon Computer GmbH, Eschborn, ISBN 3-927065-00-5

/**************************************************/ 
/* Beispielprogramm für die Benutzung eines File- */ 
/* Selectors, bei dem der vom Benutzer veränderte */ 
/* Pfad und Dateiname gemerkt wird.               */
/*------------------------------------------------*/
/* Entwickelt mit Turbo C.               10.2.'89 */
/**************************************************/ 

/* AES- und TOS-Routinen */
# include <aes.h>
# include <tos.h>

/* Konstanten */
# define PathLength 64
# define NameLength 14

/*-------------------------*/
/*   globale Variablen     */
/*-------------------------*/

/* Pfad für File-Selector mit erster Initialisierung */ 
char Path[PathLength] = "A:\\*.*";
/* "\\" in C entspricht "\" in Modula 2, Pascal, ... */

/* Name, vorerst leer */ 
char Name[NameLength];

/* Applicationsnummer */ 
int apl_id;

/*-------------------------*/
/*   Routinen              */
/*-------------------------*/

/* Hier wird unser Demo initialisiert */ 
int fdemo_init (void)
{
    apl_id=appl_init(); /* beim AES anmelden */ 
    if (apl_id==-1)     /* nicht OK? */
        return (0); 
    else
    {

        Name[0]\0';     /* Dateiname für File-Selector  */
                        /* auf Leerstring setzen        */

        Path[0]=(char) Dgetdrv()+'A'; /* Pfad mit aktu- */ 
                        /* ellem Laufwerksbuchstaben    */
                        /* versehen. Hier kann auch     */
                        /* zusätzlich der aktuelle      */
                        /* Pfad gesetzt werden.         */

        return(1);
    }
}

/* Das Demo wird verlassen... */ 
void fdemo_exit(void)

{
    appl_exit();
}

/* Hauptprogramm */ 
main ()
{
    int exbutton;

    if (fdemo_init())
    {
        exbutton=1;

        /* wiederhole, bis Abbruch angeklickt wird */ 
        while (exbutton==1)
        {
            fsel_input(Path,Name,&exbutton);
            /* Durch globale Deklaration von Path und */
            /* Name wird der Pfad und der Name wie    */
            /* vom Benutzer verändert gemerkt.        */
        }
        fdemo_exit();
    }
    return(0);
} /* Ende */

Dietmar Rabich
Links

Copyright-Bestimmungen: siehe Über diese Seite