home *** CD-ROM | disk | FTP | other *** search
- PROGRAM FULLDIR;
-
- {$N- Don't use the numeric coprocessor. }
-
- { Turbo Pascal V4.0 program to generate a a sorted list of all files in
- the named or default directory and all subdirectories.
-
- Examples:
-
- FULLDIR Full directory, starting at the current
- directory.
-
- FULLDIR C:\ Full directory, starting at the root of
- drive C:.
-
- The output of this program can be redirected. For example:
-
- FULLDIR B:\ > DIR.LIS
-
- Program by Harry M. Murphy, 3 October 1988. }
-
- USES
- DOS;
-
- CONST
- MAXNUM = 800;
-
- TYPE
- FILEREC = RECORD
- NAME : STRING[12];
- PATH : STRING[60]
- END { RECORD };
- FILELST = ARRAY[1..MAXNUM] OF FILEREC;
-
- VAR
- DIR : STRING;
- HOME : STRING;
- FLIST : FILELST;
- FNUM : INTEGER;
- N : INTEGER;
-
- { -------------------------------- }
-
- PROCEDURE SCANDIRECT;
-
- { This procedure recursively scans each directory and updates the
- file list. }
-
- CONST
- DIRF = $10;
- LOOK = $16;
-
- VAR
- DIR : STRING;
- SRCH : SEARCHREC;
-
- BEGIN
- GETDIR(0,DIR);
- FINDFIRST('*.*',LOOK,SRCH);
- WHILE DOSERROR = 0 DO
- BEGIN
- IF (SRCH.ATTR AND DIRF) <> 0
- THEN
- BEGIN
- IF SRCH.NAME[1] <> '.'
- THEN
- BEGIN
- CHDIR(SRCH.NAME);
- SCANDIRECT;
- CHDIR('..')
- END
- END
- ELSE
- BEGIN
- IF FNUM < MAXNUM
- THEN
- BEGIN
- FNUM := SUCC(FNUM);
- FLIST[FNUM].NAME := SRCH.NAME;
- FLIST[FNUM].PATH := DIR
- END
- ELSE
- BEGIN
- WRITELN('File table overflow!');
- HALT
- END
- END;
- FINDNEXT(SRCH)
- END
- END { Procedure SCANDIRECT };
-
- { -------------------------------- }
-
- PROCEDURE SORTFILE(VAR FLIST: FILELST; FNUM: INTEGER);
-
- { This routine sorts the file name array, FLIST, in ascending order,
- using a modified Shell sort algorithm. FNUM is the length of the
- array. }
-
- VAR
- I,IM,J,M : INTEGER;
- SWAP : BOOLEAN;
- TEMP : FILEREC;
-
- BEGIN { Procedure SORTFILE }
- IF FNUM > 1
- THEN
- BEGIN
- M := 1;
- WHILE M < FNUM DO M := 2*M;
- M := PRED(M);
- WHILE M > 1 DO
- BEGIN
- M := M DIV 2;
- FOR J:=1 TO FNUM-M DO
- BEGIN
- I := J;
- REPEAT
- IM := I+M;
- SWAP := FLIST[I].NAME > FLIST[IM].NAME;
- IF SWAP
- THEN
- BEGIN
- TEMP := FLIST[I];
- FLIST[I] := FLIST[IM];
- FLIST[IM] := TEMP;
- I := I-M
- END
- UNTIL (I < 1 ) OR (NOT SWAP)
- END
- END
- END
- END { Procedure SORTFILE };
-
- { -------------------------------- }
-
- BEGIN
- GETDIR(0,HOME);
- DIR := HOME;
- IF PARAMCOUNT > 0
- THEN
- BEGIN
- CHDIR(PARAMSTR(1));
- IF IORESULT = 0
- THEN
- GETDIR(0,DIR)
- ELSE
- BEGIN
- WRITELN('Can''t find directory ',PARAMSTR(1));
- HALT
- END
- END;
- FNUM := 0;
- SCANDIRECT;
- IF DIR <> HOME THEN CHDIR(HOME);
- SORTFILE(FLIST,FNUM);
- ASSIGN(OUTPUT,'');
- REWRITE(OUTPUT);
- WRITELN('Full directory of files in and below ',DIR,':');
- WRITELN;
- FOR N := 1 TO FNUM DO WRITELN(FLIST[N].NAME:12,' ',FLIST[N].PATH);
- WRITELN;
- WRITELN(FNUM,' files.')
- END.