home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* GETDIRS.PAS *)
- (* (c) 1989 by Hagen Lehmann & TOOLBOX *)
- (* ------------------------------------------------------ *)
- {$R-,S-,I-,D-,F-,V-,B-,N-,L-}
- {$M 1024,0,0}
-
- USES Crt, Dos;
-
- CONST
- CopyRight = 'GETDIRS, (C) 1989 Hagen Lehmann & TOOLBOX';
- Return = ^M^J;
- TYPE
- SearchArray = ARRAY [1..100] Of SearchRec;
- DirSearchArray = ARRAY [1..100] Of STRING;
- DriveString = STRING [2];
- VAR
- Verzeichnisse : DirSearchArray;
- Gefundene,Loop : BYTE;
- Parameter : STRING;
- Drive : DriveString;
-
- PROCEDURE GetDirs(VAR Dateien : SearchArray;
- VAR Anzahl : BYTE);
- VAR
- Suche : SearchRec;
- BEGIN
- Anzahl := 0;
- FindFirst('*', Directory, Suche);
- IF DosError = 0 THEN { Eintrag vorhanden? }
- REPEAT { ja, weitere einlesen }
- Anzahl := Anzahl + 1;
- IF Suche.Attr = Directory THEN
- Dateien[Anzahl] := Suche { abspeichern }
- ELSE
- Anzahl := Anzahl - 1;
- FindNext(Suche); { nächster Pfad }
- UNTIL (DosError <> 0) OR (Anzahl >= 100); { Ende }
- END;
-
- PROCEDURE GetAllDirs(Laufwerk : DriveString;
- VAR Pfade : DirSearchArray;
- VAR Gefunden : BYTE);
- LABEL Ende;
- VAR
- Dateien : SearchArray;
- Pfad, TestPfad : STRING;
- Anzahl, i, j, Getestet : BYTE;
- Vorhanden, NichtGefunden : BOOLEAN;
- BEGIN
- GetDir(0, Pfad); { aktiven Pfad speichern }
- ChDir(Laufwerk + '\');
- GetDir(0, TestPfad);
- For i := 1 TO 100 DO Pfade[i] := '';
- { Pfadspeicher löschen }
- Gefunden := 0;
- Getestet := 1;
- Pfade[1] := TestPfad[1] + ':\'; { Hauptpfad speichern }
- GetDirs(Dateien, Anzahl);
- IF Anzahl > 1 THEN
- { Kontrolle, ob überhaupt Pfade vorhanden }
- REPEAT
- GetDirs(Dateien, Anzahl); { weitere einlesen }
- IF (Dateien[1].Name = '.') AND
- (Dateien[2].Name = '..') THEN BEGIN
- FOR i := 1 TO Anzahl DO
- { die ersten beiden Einträge löschen }
- Dateien[i] := Dateien[i + 2];
- Anzahl := Anzahl - 2;
- END;
- IF Anzahl > 0 THEN BEGIN
- { sind sonst noch Pfade vorhanden? }
- FOR i := 1 TO Anzahl DO BEGIN
- { ja, dann jeden kontrollieren }
- ChDir(Dateien[i].Name);
- { in Unterverzeichnis wechseln }
- GetDir(0, TestPfad); { vollen Pfadnamen holen }
- ChDir('..'); { zurückkehren }
- Vorhanden := FALSE;
- FOR j := 1 TO Getestet DO
- { ist dieser Pfad schon gespeichert? }
- IF Pfade[J] = TestPfad THEN Vorhanden := TRUE; { ja }
- IF NOT Vorhanden THEN BEGIN
- Getestet := Getestet + 1;
- { dann Zähler erhöhen und }
- Pfade[Getestet] := TestPfad;
- { Pfad abspeichern }
- END;
- END;
- Gefunden := Gefunden + 1;
- NichtGefunden := TRUE;
- ChDir(Pfade[Getestet]);
- { in nächsten Pfad wechseln }
- IF IOResult <> 0 THEN GOTO Ende;
- { ist dieser vorhanden? }
- END ELSE BEGIN
- IF NOT NichtGefunden THEN
- Gefunden := Gefunden + 1;
- ChDir(Pfade[Gefunden]);
- IF IOResult <> 0 THEN GOTO Ende;
- NichtGefunden := FALSE;
- END;
- IF Length(Pfade[Gefunden]) = 0 THEN GOTO Ende;
- UNTIL (IOResult <> 0) OR (Getestet >= 100);
- Ende:
- Gefunden := Getestet; { Anzahl der Pfade übergeben }
- ChDir(Pfad); { altes Verzeichnis wiederherstellen }
- END;
-
- BEGIN
- Parameter := ParamStr(1); { Parameter holen }
- Drive := ''; { aktuelles Laufwerk setzen }
- IF (UpCase(Parameter[1]) IN ['A'..'Z']) AND
- (Parameter[2]=':') And (Length(Parameter) = 2) THEN
- Drive := Parameter;
- IF Parameter = '?' THEN BEGIN
- ClrScr;
- WriteLn; WriteLn('Aufruf : GETDIRS [d:] '); WriteLn;
- WriteLn(' Beispiel :');
- WriteLn(' A:\>getdirs a:');
- WriteLn(' (sucht alle Pfade im Laufwerk A:)');
- WriteLn(' A:\>getdirs');
- WriteLn(' (sucht alle Pfade im aktuellen Laufwerk)');
- Halt; { Programmstop }
- END;
- WriteLn(CopyRight, Return); { Copyright schreiben }
- Write('Scanning disk to get tree information ...');
- GetAllDirs(Drive, Verzeichnisse, Gefundene);
- WriteLn(Return);
- FOR Loop := 1 TO Gefundene DO
- WriteLn(Verzeichnisse[Loop]);
- WriteLn(Return, Gefundene, ' directories found.');
- END.
- (* ------------------------------------------------------ *)
- (* Ende von GETDIRS.PAS *)