← ST-Computer 05 / 1992

Verschlungene Pfade und dunkle Wege

Programmierpraxis

Jedes Programm benutzt Funktionen, die sich mit Pfaden, Dateien, Laufwerken und der Dateiauswahlbox beschÀftigten. Diese Funktionen und ein paar allgemeine Dinge zum Thema Dateien und Pfade sollen im Rahmen dieses Beitrags erörtert werden.

Was ist ĂŒberhaupt ein Pfad? GenĂŒgt es nicht, wenn eine Datei einfach einen bestimmten Namen hat? Nun, in Ă€lteren Betriebssystemen genĂŒgte tatsĂ€chlich ein einfacher Name. Es gab noch kein hierachisch aufgebautes Dateisystem, weil in den meisten FĂ€llen gar keine Notwendigkeit vorhanden war. Die Zahl der Dateien, die auf einem Medium gemeinsam Platz fanden, war einfach zu gering. Selbst bei einer gut gefĂŒllten Diskette war immer noch der Überblick gewahrt. Mit wachsender KapazitĂ€t von Disketten und auch Festplatten war jedoch ein neues Dateisystem unumgĂ€nglich. Die entscheidende Neuerung war, daß nicht mehr nur ein Verzeichnis fĂŒr alle Dateien auf einem Medium zustĂ€ndig war, sondern mehrere. Man schuf ein hierarchisches Verzeichnissystem: Das Hauptverzeichnis oder auch Wurzel- Verzeichnis (engl. Rootdirectory) konnte nun neben den ‘normalen’ Dateien auch selbst wieder Verzeichnisse, sogenannte Unterverzeichnisse, enthalten. Diese Verzeichnisse enthalten ihrerseits Dateien und möglicherweise weitere Unterverzeichnisse.

Man kann sich das vorstellen wie einen Aktenschrank, der viele, verschieden beschriftete Schubladen hat. In jeder Schublade befinden sich eine Reihe von Sammelordnern, die wiederum einzelne Akten enthalten. Auf diese Weise kann man die Ordnung erhöhen und leichter die Übersicht behalten. Allerdings sind zum Auffinden einer bestimmten Akte auch mehr Informationen notwendig. Der Name allein genĂŒgt oft nicht mehr, wenn man nicht endlos herumsuchen will. „Nimm aus der Schublade ‘Software’ die Mappe ‘OMIKRON’ und bring mir den Beleg ’03-1801’ so z.B. könnte eine ‘Zugriffsanweisung’ aussehen, um schnell an eine bestimmte Sache zu gelangen. Diese ‘Wegbeschreibung’, die genau vorgibt, wie man an die gesuchte Sache gelangt, ist die genaue Analogie eines Pfades in unserem Dateisystem. Man kann sich ein hierarchisches Verzeichnissystem auch wie einen Baum vorstellen. Unten befindet sich das Wurzelverzeichnis und darĂŒber als erste Verzweigungen die in ihm enthaltenen Unterverzeichnisse. Enthalten diese weitere Verzeichnisse, so werden sie wieder eine Etage höher angeordnet usw. Ein Pfad beschreibt nun genau den Weg, den man, ausgehend von der Wurzel, gehen muß, um ein bestimmtes Ziel zu erreichen. Man notiert den Pfad auf eine ganz bestimmte Weise: Zuerst kommt der Laufwerksbuchstabe (‘A’-’P’), gefolgt von einem Doppelpunkt. Danach werden nun die Namen der einzelnen Verzeichnisse aufgezĂ€hlt, die von unten nach oben im Verzeichnisbaum durchlaufen werden. Zum Schluß wird der eigentliche Dateiname angefĂŒgt. Die einzelnen Verzeichnisnamen und auch der Dateiname werden untereinander mit einem RĂŒckwĂ€rtsschrĂ€gstrich (engl. Backslash) ‘V abgetrennt. Der vollstĂ€ndige Pfad mĂŒĂŸte fĂŒr das obige Beispiel lauten: „A:\SOFTWARE\OMIKRON\03-1801". Das Laufwerk wurde willkĂŒrlich zu ‘A’ gewĂ€hlt. Damit nun ein solches Dateisystem möglichst effizient genutzt werden kann, sollten alle Programme es auch benutzen und berĂŒcksichtigen. Das beste Dateisystem nĂŒtzt nĂ€mlich nichts, wenn das Accessory XY seine Konfigurationsdatei immer auf Laufwerk C im Wurzelverzeichnis erwartet. Andererseits ist es natĂŒrlich auch recht umstĂ€ndlich, immer den gesamten Zugriffspfad angeben zu mĂŒssen, bevor irgendein Programm an bestimmte Daten gelangt. Hier sind deshalb einige hilfreiche Funktionen im Betriebssystem vorgesehen, die den Umgang mit Pfaden sehr erleichtern. ZunĂ€chst ist hier der Standardpfad zu nennen. Das Betriebssystem verwaltet fĂŒr jedes Laufwerk einen Standardpfad, der es erlaubt, die Pfadangabe entsprechend zu verkĂŒrzen. Zusammen mit dem Standardlaufwerk ist sogar wieder der Dateiname alleine ausreichend. Wenn also nichts anderes angegeben ist als nur der Dateiname, so sieht das Betriebssystem automatisch auf dem Standardlaufwerk unter dem Standardpfad nach, ob die gewĂŒnschte Datei dort existiert. Zwischen den beiden Extremen vollstĂ€ndiger Pfadname und alleiniger Dateiname sind beliebige AbkĂŒrzungen möglich. Man kann z.B. die Laufwerksbezeichnung weglassen: „\SOFTWARE\OMIKRON\03-1801“. In diesem Fall wird automatisch das Standardlaufwerk ergĂ€nzt. Genauso ist es denkbar, den Pfad wegzulassen, also etwa „C:03-1801 “. Jetzt wird der Standardpfad von Laufwerk C automatisch eingefĂŒgt. Diese Schreibweise ist sorgfĂ€ltig zu unterscheiden von „C:\03-1801“. Hier wird nĂ€mlich durch den Backslash zum Ausdruck gebracht, daß es sich um das Wurzelverzeichnis von Laufwerk C handelt. Der Pfad fehlt hier also nicht etwa, sondern er besteht nur aus dem einen Zeichen ‘V. Eine weitere Möglichkeit ist die Angabe eines relativen Pfades. Nehmen wir an, der Standardpfad von Laufwerk C sei „\SOFTWARE\“, dann könnte man obigen Pfad auch „C:OMIKRON\03-1801“ schreiben. Wie Sie sehen, fehlt wieder der Backslash zu Beginn der Pfadangabe. Dies veranlaßt das Betriebssystem wiederum, den Standardpfad nach dem Doppelpunkt einzufĂŒgen, um so einen vollstĂ€ndigen Pfad zu erzeugen. Die Bezeichnung ‘relativ’ rĂŒhrt daher, daß die Pfadangabe sich hier auf den Standardpfad bezieht und ohne ihn unvollstĂ€ndig ist. Bei relativen Pfadangaben ist noch eine spezielle weitere Schreibweise vorgesehen, die sonst nicht verwendet wird: Ein Verzeichnis mit Namen meint jeweils das ĂŒbergeordnete Verzeichnis. Die Pfadangabe C:..\TES~DPROBE.DAT geht vom Standardverzeichnis des Laufwerks C aus ein Verzeichnis zurĂŒck (in das sogenannte Vaterverzeichnis) und dort dann in das Verzeichnis „TEST“. Diese letzte Art der Pfadangabe ist aber selten sinnvoll einsetzbar. Wichtig zu merken sind vor allem vier FĂ€lle:

  1. nur der Dateiname: EinfĂŒgen von Standardpfad und Standardlaufwerk

  2. Laufwerk und Dateiname: EinfĂŒgen des Standardpfades des Laufwerks

  3. relativer Pfad und Dateiname: EinfĂŒgen des Standardpfades zwischen Laufwerk und relativem Pfad

  4. vollstĂ€ndiger Pfad und Dateiname: dem ist nichts hinzuzufĂŒgen.

Wie nun diese Pfade vom BASIC aus in den Griff zu bekommen sind, ist in Listing 1 zu erkennen.

'(c)1932 by MAXON-Computer ' DEF FN Get_Path$' liefert Standardpfadnamen vom Standardlaufwerk LOCAL Path$, Drive%L, Adr%L GEMDOS (Drive%L, $19) Path$= CHR§(0)*66 Adr%L= LPEEK ( VARPTR(Path$)) + LPEEK ( SEGPTR + 28)' Stringadresse GEMDOS (, $47, L Adr%L,Drive%L+1) Path$= CHR$ (Drive%L+65) + ":"+ LEFT$(Path$, INSTR(Path$,CHR$(0))-1)+"\" RETURN Path$ ' DEF FN Get_Path$(Drive$) ' liefert den Standardpfadnamen von Laufwerk LOCAL Path$,Drive%L,Adr%L Drive%L= ASC( UPPER$(Drive$)) - ASC("A")'Nummer des Laufwerks Path$= CHR$(0)*66 Adr%L= LPEEK ( VARPTR (Path$) ) + LPEEK ( SEGPTR + 28)'Stringadresse GEMDOS (, $47, L Adr%L,Drive%L+1) Path$= CHR$(Drive%L+65)+" : "+ LEFTS(Path$, INSTR(Path$,CHR$(0))-1)+"\" RETURN Path$ ' DEF PROC Set_Path(Path$)' setzt den Standardpfad des LW LOCAL Adr%L, Drive%L, Drive2%L GEMDOS Drive%L,$19' altes Standard LW merken Drive2%L= ASC( UPPER$(Path$))- ASC("A")'Nummer des Laufwerks GEMDOS ,$E, Drive2%L Path$=Path$+ CHR$(0)' Nullzeichen als Endekennung anhÀngen Adr%L= LPEEK( VARPTR(Path$))+ LPEEK( SEGPTR+ 28)'Stringadresse GEMDOS , $3B, L Adr%L GEMDOS , $E,Drive%L RETURN ' DEF PROC Set_Drive(Drive$)' setzt das StandardLW LOCAL Drive%L Drive%L= ASC ( UPPER$(Drive$) ) - ASC("A")'Nummer des Laufwerks GEMDOS (, $E, Drive%L) RETURN ' DEF PROC Set_Drive_And_Path(Path$) CHDIR Path$ RETURN

Listing 1.

Wenn man sich nun aber mit allen Aktionen nicht auf ein bestimmtes Laufwerk oder einen bestimmten Pfad beschrĂ€nken will, so steht mit der sogenannten Dateiauswahlbox eine weitere, Ă€ußerst nĂŒtzliche Betriebssystemfunktion zur VerfĂŒgung. Sie erlaubt es, den Pfad und das Laufwerk beliebig zu wechseln und den Dateinamen einfach aus einer Liste zu ĂŒbernehmen. Die Verwendung dieser Funktion garantiert also volle UnterstĂŒtzung des hierarchischen Dateisystems. Sie sollte deshalb bei jeder Dateifunktion, die eine Benutzerauswahl erfordert, aufgerufen werden. Wie diese Funktion in OMIKRON.Basic aussieht und was zu beachten ist, zeigt das Listing 2 (diese Funktionen sind ĂŒbrigens alle bereits komplett in der EasyGEM-Library enthalten):

Wie aus dem Listing zu ersehen ist, ruft man die Dateiauswahlbox sinnvollerweise mit dem Standardpfad des Standardlaufwerks auf. Dieser Pfad ist nĂ€mlich immer genau auf den Pfad eingestellt, von dem das Programm gestartet wurde. Wichtig ist noch die sogenannte „Jokerauswahl“. Es ist sinnvoll, die in der Dateiauswahlbox dargestellte Liste von Dateinamen möglichst kurz zu halten und bestimmte „Dateitypen“ von vorneherein auszuklammern. Zu diesem Zweck trifft man eine Auswahl mit Hilfe von sogenannten ‘Jokerzeichen’. Das erste Jokerzeichen steht stellvertretend fĂŒr beliebig viele Zeichen, das zweite “?’ steht fĂŒr genau ein Zeichen. Die beiden Teile des Dateinamens - Name und Erweiterung - werden dabei getrennt behandelt. So paßt die Auswahl „*.BAS“ auf alle Dateien mit der Erweiterung „BAS“.

paßt auf alle Dateien, die aus Dateinamen und Erweiterung bestehen. „.AC?“ paßt auf alle Dateien, deren Erweiterung mit „AC“ beginnt, also etwa„ACC“ oder„ACX“.„A.BAK“ paßt auf alle Dateien, deren Namen mit „A“ beginnt und die die Erweiterung „BAK“ haben. Wenn man also der Dateiauswahlbox zusĂ€tzlich noch eine sinnvolle Erweiterung ĂŒbergibt, bleibt die Zahl der wĂ€hlbaren Dateien ĂŒbersichtlich. Eventuell sollte man nach der Benutzerauswahl prĂŒfen, ob der Benutzer den Pfad oder das Laufwerk geĂ€ndert hat und den Standardpfad und das Standardlaufwerk entsprechend setzen. So kann vermieden werden, daß bei einer neuerlichen Auswahl der Pfad wieder umgestellt werden muß. Er bleibt dann immer auf dem zuletzt benutzen Pfad stehen. Es bleibt zu hoffen, daß - ausgestattet mit diesen Funktionen -möglichst immer eine vernĂŒnftige Pfadbehandlung vorgesehen wird. So sind selbst kleinere Programme, was Dateiauswahl angeht, einfach und einheitlich bedienbar.

'(C)1992 by MAXON-Computer ' DEF FN Get_Name$(Path$,Name$) ' entfernt Jokerzeichen am 'Pfadende und hĂ€ngt den Dateinamen an LOCAL A$=Path$ A$= LEFTS(A$, LEN(A$)-INSTR(MIRROR$(A$), "\")+1) A$=A$+Name$ RETURN A$ ' DEF FN Exist%L(A$) ' stellt fest, ob eine Datei existiert LOCAL Exist%L=0' OPEN "F",16,A$,63 IF NOT EOF(16) THEN Exist%L=-1 CLOSE 16 RETURN Exist%L ' DEF PROC Fsel(Ext$,R Name$,R Ok%L) 'Ext$ = Index der gewĂŒnschten Auswahl (z.B. *.* oder *.TXT) 'Name$: IN: Namensvorgabe OUT: entgultiger Name mit Pfad 'Ok: OK oder Abbruch ' LOCAL Path$=FN Get_Path$+Ext$ MOUSEON FSEL_INPUT (Path$,Name$,Ok%L) MOUSEOFF Name$=FN Get_Name$(Path$,Name$) ' RETURN

Listing 2.

Stefan Rinke