Directory als Baumdiagramm

Das Desktop stellt mit seinen Fenstern zwar komfortabel Ausschnitte der Ordnerstruktur dar, möchte man aber einen Überblick über das gesamte Directory einer Diskette oder gar Festplatten-Partition gewinnen, reicht die Darstellung nicht mehr aus. Eines der ‘Norton Utilities’ (für PCs) stellt u.a. die Ordnerstruktur als Baumdiagramm dar, genau dies leistet auch das abgedruckte GFA-Basic-Programm.

Zunächst wird der Pfad ausgewählt, von wo aus der Dateibaum gezeichnet werden soll. Danach wird das Ausgabegerät bestimmt. Die Bildschirmausgabe läßt sich mit der linken Maustaste anhalten. mit der rechten geht es weiter. Bei der Datei-Ausgabe muß man noch den Namen der Ausgabedatei eingeben, dann wird der entsprechende Kanal geöffnet. Beim Ausdruck erfolgt keine Anpassung der Sonderzeichen (hier „|“ und „\“). Diese muß man für seinen Drucker evtl. noch selber einfügen. oder man benutzt die residenten Anpassungsprogramme PTEPSON bzw. PTIBM, die dem GFA-BASIC beigelegt waren.

Wie wird nun das Baumdiagramm gezeichnet? Da Bäume rekursive Datenstrukturen darstellen, geht man beim Aufbauen und Zeichnen derselben am einfachsten auch rekursiv vor. Die Prozedur direktory_zusammensuchen ruft sich solange selber auf. bis keine weiteren Dateien mehr gefunden werden. Es sollte mit geringen Aufwand möglich sein, das Programm in andere Programmiersprachen, die Betriebssystem-Aufrufe und Rekursion zulassen, zu übertragen. Zur Dateisuche werden die GEMDOS-Funktionen Fsfirst und Fsnext verwendet. Fsfirst durchsucht das aktuelle Directory nach Dateien, auf die der angegebene Name paßt. Dabei bestimmt der zweite Parameter "attribut" nach welchen Dateienamen gesucht werden soll (16 bedeutet hierbei, daß auch nach Ordnern gesucht werden soll). Das Ergebnis wird in der DTA abgelegt. Fsnext setzt die mit Fsfirst() begonnene Suche fort. Nähere Informationen zu diesen Funktionen sind z.B. in [ 1 ] zu finden. Die Prozedur dateinamen_bestimmen liest den Dateinamen aus der DTA. Vorsatz gibt die vor dem Dateinamen stehenden senkrechten Striche des Baumdiagrammes aus und schalt (gehörte ebenfalls zum Lieferumfang des GFA-BASICS) schaltet auf die 8x8-Kleinschrift um.

' ++++++++++++++++++++++++++++++++++++++++++++++
' DIRBAUM.BAS Directory als einfaches 
' Baumdiagramm darstellen / von Peter Ubachs
' ++++++++++++++++++++++++++++++++++++++++++++++
' + (c) MAXON Computer GmbH 1990
' ++++++++++++++++++++++++++++++++++++++++++++++
'
' benutzte GEMDOS-Funktionen
DEFFN fsfirst(adr_dateiname%,attribut%)=GEMDOS(&H4E,L:adr_dateiname%,attribut%) 
DEFFN fsnext=GEMDOS(&H4F)
@schalt(4) !8x8 Kleinschrift
'
max_dateien%=2500
max_ebenen%=15
DIM name$(max_dateien%,max_ebenen%)
DIM anz_dateien%(max_ebenen%),nr%(max_ebenen%)
'
einrueck%=10
'
DO
    ' Welcher Pfad?
    FILESELECT DIR$(0)+"\*.*","",pfad$
    ' ----------------------------------------
    EXIT IF pfad$="" !-Abbruch angeklickt?
    ' ----------------------------------------
    WHILE RIGHT$(pfad$)<>"\"
        pfad$=LEFT$(pfad$,LEN(pfad$)-1)
    WEND
    CHDIR pfad$
    '
    ' Ausgabegerät?
    ALERT 2,"A u s g a b e g e r ä t ?",1,"Monitor|Drucker|Datei",antw%
    IF antw%=1
        OPEN "O",#1,"CON:"
        CLS
    ELSE
        IF antw%=2
            OPEN "O",#1,"PRN:"
        ELSE
            FILESELECT DIR$(0)+"\*.*","",dirpfad$
            OPEN "O",#1,dirpfad$
        ENDIF
    ENDIF
    '
    VOID GEMDOS(&H1A,L:BASEPAGE+128) !DTA setzen
    PRINT #1;pfad$
    ebene%=1
    @directory_zusammensuchen(ebene%,pfad$)
    '
    IF antw%=1
        PRINT "                             "+CHR$(27)+"p Taste drücken "+CHR$(27)+"q"; 
        REPEAT
        UNTIL LEN(INKEY$)
    ENDIF
    CLOSE
LOOP
@schalt(8)
EDIT
'
PROCEDURE directory_zusammensuchen(ebene%,pfad$) 
    LOCAL fsret%,dateiname$,datei_nr%,suchpfad$ 
    suchpfad$=pfad$+"*.*"+CHR$(0) 
    datei_nr%=0
    fsret%=FN fsfirst(VARPTR(suchpfad$),16)
    WHILE fsret% = 0
        @dateiname_bestimmen(*dateiname$) !d.h. aus der DTA lesen 
        IF dateiname$<>"." AND dateiname$<>".."
            INC datei_nr%
            name$(datei_nr%,ebene%)=dateiname$ !abspeichern
        ENDIF
        fsret%=FN fsnext 
    WEND
    anz_dateien%(ebene%)=datei_nr%
    '
    '
    IF anz_dateien%(ebene%)>0 
        @vorsatz(ebene%)
        PRINT #1;"|"
    ENDIF
    '
    nr%(ebene%)=1
    WHILE nr%(ebene%)<=anz_dateien%(ebene%)
        IF MOUSEK=1 !linke Maustaste: Halt 
            REPEAT
            UNTIL MOUSEK=2 !rechte Maustaste: Weiter
        ENDIF
        @vorsatz(ebene%)
        PRINT #1;"|_____ ";name$(nr%(ebene%),ebene%)
        @directory_zusammensuchen(ebene%+1,pfad$+name$(nr%(ebene%),ebene%)+"\")
        INC nr%(ebene%)
    WEND
    '
    IF (anz_dateien%(ebene%)>0) AND (nr%(ebene%-1)<anz_dateien%(ebene%-1))
        @vorsatz(ebene%)
        PRINT #1 
    ENDIF
    '
RETURN
'
PROCEDURE dateiname_bestimmen(adr_name%)
    LOCAL name$,i% 
    i%=BASEPAGE+128+30 
    WHILE PEEK(i%)
        name$=name$+CHR$(PEEK(i%))
        INC i%
    WEND
    *adr_name%=name$
RETURN
'
PROCEDURE vorsatz(ebene%)
    LOCAL l%
    IF ebene%>1
        FOR l%=1 TO ebene%-1
            IF nr%(l%)<anz_dateien%(l%)
                PRINT #1;"|";SPACE$(einrueck%-1);
            ELSE
                PRINT #1;SPACE$(einrueck%);
            ENDIF 
        NEXT l%
    ENDIF
RETURN
'
PROCEDURE schalt(x)
    a$=MKI$(&HA000)+MKI$(&H2009)+MKI$(&H4E75) 
    a=VARPTR(a$) 
    a=C:a()
    LPOKE INTIN,LPEEK(a+x)
    DPOKE CONTRL+2,0 
    DPOKE CONTRL+6,0 
    DPOKE CONTRL+10,102 
    VDISYS 5 
RETURN
' @schalt(4)=Kleinschrift 8*8 
' Sschalt(8)=Grossschrift 8*16

Peter Ubachs
Aus: ST-Computer 09 / 1990, Seite 82

Links

Copyright-Bestimmungen: siehe Über diese Seite