{************************************************} { } { Turbo Directory Demo } { Copyright (c) 1985,90 by Borland International } { } {************************************************} program DirDemo; { Demonstration program that shows how to use: o Directory routines from DOS unit o Procedural types (used by QuickSort) Usage: dirdemo [options] [directory mask] Options: -W Wide display -N Sort by file name -S Sort by file size -T Sort by file date and time Directory mask: Path, Filename, wildcards, etc. } {$I-,S-} {$M 8192,8192,655360} uses Dos; const MaxDirSize = 512; MonthStr: array[1..12] of string[3] = ( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); type DirPtr = ^DirRec; DirRec = record Attr: Byte; Time: Longint; Size: Longint; Name: string[12]; end; DirList = array[0..MaxDirSize - 1] of DirPtr; LessFunc = function(X, Y: DirPtr): Boolean; var WideDir: Boolean; Count: Integer; Less: LessFunc; Path: PathStr; Dir: DirList; function NumStr(N, D: Integer): String; begin NumStr[0] := Chr(D); while D > 0 do begin NumStr[D] := Chr(N mod 10 + Ord('0')); N := N div 10; Dec(D); end; end; {$F+} function LessName(X, Y: DirPtr): Boolean; begin LessName := X^.Name < Y^.Name; end; function LessSize(X, Y: DirPtr): Boolean; begin LessSize := X^.Size < Y^.Size; end; function LessTime(X, Y: DirPtr): Boolean; begin LessTime := X^.Time > Y^.Time; end; {$F-} procedure QuickSort(L, R: Integer); var I, J: Integer; X, Y: DirPtr; begin I := L; J := R; X := Dir[(L + R) div 2]; repeat while Less(Dir[I], X) do Inc(I); while Less(X, Dir[J]) do Dec(J); if I <= J then begin Y := Dir[I]; Dir[I] := Dir[J]; Dir[J] := Y; Inc(I); Dec(J); end; until I > J; if L < J then QuickSort(L, J); if I < R then QuickSort(I, R); end; procedure GetCommand; var I,J: Integer; Attr: Word; S: PathStr; D: DirStr; N: NameStr; E: ExtStr; F: File; begin WideDir := False; @Less := nil; Path := ''; for I := 1 to ParamCount do begin S := ParamStr(I); if S[1] = '-' then for J := 2 to Length(S) do case UpCase(S[J]) of 'N': Less := LessName; 'S': Less := LessSize; 'T': Less := LessTime; 'W': WideDir := True; else WriteLn('Invalid option: ', S[J]); Halt(1); end else Path := S; end; Path := FExpand(Path); if Path[Length(Path)] <> '\' then begin Assign(F, Path); GetFAttr(F, Attr); if (DosError = 0) and (Attr and Directory <> 0) then Path := Path + '\'; end; FSplit(Path, D, N, E); if N = '' then N := '*'; if E = '' then E := '.*'; Path := D + N + E; end; procedure FindFiles; var F: SearchRec; begin Count := 0; FindFirst(Path, ReadOnly + Directory + Archive, F); while (DosError = 0) and (Count < MaxDirSize) do begin GetMem(Dir[Count], Length(F.Name) + 10); Move(F.Attr, Dir[Count]^, Length(F.Name) + 10); Inc(Count); FindNext(F); end; end; procedure SortFiles; begin if (Count <> 0) and (@Less <> nil) then QuickSort(0, Count - 1); end; procedure PrintFiles; var I, P: Integer; Total: Longint; T: DateTime; N: NameStr; E: ExtStr; begin WriteLn('Directory of ', Path); if Count = 0 then begin WriteLn('No matching files'); Exit; end; Total := 0; for I := 0 to Count-1 do with Dir[I]^ do begin P := Pos('.', Name); if P > 1 then begin N := Copy(Name, 1, P - 1); E := Copy(Name, P + 1, 3); end else begin N := Name; E := ''; end; Write(N, ' ': 9 - Length(N), E, ' ': 4 - Length(E)); if WideDir then begin if Attr and Directory <> 0 then Write(' DIR') else Write((Size + 1023) shr 10: 3, 'k'); if I and 3 <> 3 then Write(' ': 3) else WriteLn; end else begin if Attr and Directory <> 0 then Write('