home *** CD-ROM | disk | FTP | other *** search
- DECLARE SUB GetDir (Path$)
- DECLARE SUB FindNextFile (DTA$, Fehler%)
- DECLARE SUB GetCurrDrive (LW$)
- DECLARE SUB FindFirstFile (Pattern$, Attr%, Trans$, Result%)
-
- '* ------------------------------------------------------- *
- '* TREE.BAS *
- '* Auslesen der Verzeichnisse des aktuellen Laufwerks *
- '* in ein Array zur weiteren Verarbeitung, zum Beispiel *
- '* für einen cursorgesteuerten Verzeichniswechsel. *
- '* *
- '* (c) 1989 W.Rinke & TOOLBOX *
- '* ------------------------------------------------------- *
- CONST Normal = 0
- CONST ReadOnly = 1
- CONST Hidden = 2
- CONST SysFile = 4
- CONST VolumeID = 8
- CONST Directory = 16
- CONST Archive = 32
- CONST AnyFile = 63 '* die Dateiattribute
-
- CONST MaxDirs = 500 '* Anzahl der Verzeichnisse
-
- TYPE Registers
- ax AS INTEGER
- bx AS INTEGER
- cx AS INTEGER
- dx AS INTEGER
- bp AS INTEGER
- si AS INTEGER
- di AS INTEGER
- Flags AS INTEGER
- ds AS INTEGER
- es AS INTEGER
- END TYPE '* die Prozessor-Register
-
- DIM SHARED EntryArray(1 TO MaxDirs) AS STRING
- '* Global: Array für Einträge
- COMMON counter% '* Global: der Eintrag-Zähler
-
- '* ---------------- Hauptprogramm ------------------------ *
- CALL GetCurrDrive(Drive$) '* Aktuelles Laufwerk ermitteln
-
- counter% = 0
-
- FOR i% = 1 TO MaxDirs
- EntryArray(i%) = "" '* Array löschen
- NEXT i%
-
- CALL GetDir(Drive$) '* Rekursiv: Verzeichnisse lesen
-
- FOR i% = 1 TO counter%
- PRINT EntryArray(i%) '* Bange Frage: Hat's geklappt?
- NEXT i%
-
- END '* Nur zur Information...
-
- '* ------------------------------------------------------- *
- SUB FindFirstFile (Pattern$, Attr%, Trans$, Result%)
- DIM Regs AS Registers
-
- Path$ = Pattern$ + CHR$(0) '* Ende der Zeichenkette,
- '* braucht DOS
- Regs.ax = &H2F00 '* aktuelle DTA sichern
- CALL InterruptX(&H21, Regs, Regs)
- DTASeg% = Regs.es
- DTAOfs% = Regs.bx
-
- Trans$ = SPACE$(43) '* Platz für eigenen Puffer
- Regs.ax = &H1A00 '* eigener Puffer wird DTA
- Regs.ds = VARSEG(Trans$)
- Regs.dx = SADD(Trans$)
- CALL InterruptX(&H21, Regs, Regs)
-
- Regs.ax = &H4E00 '* DOS: ersten passenden
- Regs.cx = Attr% '* Eintrag suchen
- Regs.ds = VARSEG(Path$)
- Regs.dx = SADD(Path$)
- CALL InterruptX(&H21, Regs, Regs)
-
- IF (Regs.Flags AND 1) = 1 THEN '* Fehlererkennung
- Fehler% = Regs.ax
- ELSE
- Fehler% = 0
- END IF
-
- Regs.ax = &H1A00 '* DTA zurückschreiben
- Regs.ds = DTASeg%
- Regs.dx = DTAOfs%
- CALL InterruptX(&H21, Regs, Regs)
-
- END SUB
-
- '* ------------------------------------------------------- *
- SUB FindNextFile (DTA$, Fehler%)
- DIM Regs AS Registers
-
- IF LEN(DTA$) <> 43 THEN '* wurde 'FindFirst'
- Fehler% = 2 '* aufgerufen?
- EXIT SUB
- END IF
-
- Regs.ax = &H2F00 '* aktuelle DTA sichern
- CALL InterruptX(&H21, Regs, Regs)
- DTASeg% = Regs.es
- DTAOfs% = Regs.bx
-
- Regs.ax = &H1A00 '* DTA auf eigenen Puffer,
- Regs.ds = VARSEG(DTA$) '* enthält Suchkriterien
- Regs.dx = SADD(DTA$)
- CALL InterruptX(&H21, Regs, Regs)
-
- Regs.ax = &H4F00 '* suche nächsten Eintrag
- CALL InterruptX(&H21, Regs, Regs)
-
- IF (Regs.Flags AND 1) = 1 THEN '* Fehlererkennung
- Fehler% = Regs.ax
- ELSE
- Fehler% = 0
- END IF
-
- Regs.ax = &H1A00 '* DTA zurücksetzen
- Regs.ds = DTASeg%
- Regs.dx = DTAOfs%
- CALL InterruptX(&H21, Regs, Regs)
-
- END SUB
-
- '* ------------------------------------------------------- *
- SUB GetCurrDrive (LW$)
- DIM Regs AS Registers
-
- Regs.ax = &H1900
- CALL InterruptX(&H21, Regs, Regs)
-
- LW$ = CHR$((Regs.ax AND &HFF) + 65) + ":\"
-
- END SUB
-
- '* ------------------------------------------------------- *
- SUB GetDir (Path$)
- SHARED counter%
-
- CALL FindFirstFile(Path$+"*.*", Directory, DTA$, Fehler%)
- IF Fehler% = 0 THEN
- Attr = ASC(MID$(DTA$, 22, 1))
- temp$ = MID$(DTA$, 31) + CHR$(0)
- Nam$ = LEFT$(temp$, INSTR(temp$, CHR$(0)) - 1)
- IF Attr = Directory AND LEFT$(Nam$, 1) <> "." THEN
- counter% = counter% + 1
- NewPath$ = Path$ + Nam$
- EntryArray(counter%) = NewPath$
- PRINT counter%, EntryArray(counter%)
- CALL GetDir(NewPath$ + "\")
- END IF
-
- DO
- CALL FindNextFile(DTA$, Fehler%)
- IF Fehler% = 0 THEN
- Attr = ASC(MID$(DTA$, 22, 1))
- temp$ = MID$(DTA$, 31) + CHR$(0)
- Nam$ = LEFT$(temp$, INSTR(temp$, CHR$(0)) - 1)
- IF Attr = Directory AND LEFT$(Nam$, 1) <> "." THEN
- counter% = counter% + 1
- NewPath$ = Path$ + Nam$
- EntryArray(counter%) = NewPath$
- PRINT counter%, EntryArray(counter%)
- CALL GetDir(NewPath$ + "\")
- END IF
- END IF
- LOOP UNTIL Fehler% = 18
- END IF
-
- END SUB
- '* ------------------------------------------------------- *
- '* Ende von TREE.BAS *