{$N+} uses crt, dos; const maxDegree = 19; step = 100 * 1024; type TLong = array[0..maxDegree] of Integer; var startDir : string; sizes : TLong; type ttype = record dir: string; end; ptitem = ^titem; tstack = ptitem; titem = record info: ttype; next: ptitem; end; procedure initStack(var s: tstack); begin s := nil end; function isEmpty(var s: tstack): boolean; begin isEmpty := (s = nil) end; procedure pushStack(var s: tstack; const T: ttype); var nItem: ptitem; begin new(nItem); nItem^.next := s; nItem^.info := T; s := nItem; end; procedure popStack(var s: tstack; var T: ttype); var todelete: PTItem; begin if not isEmpty(s) then begin ToDelete := s; s := s^.next; T := ToDelete^.info; dispose(ToDelete) end; end; procedure GetFiles(fn, dir : string; var L : TLong); var search : SearchRec; stack: tstack; t: ttype; begin initStack(stack); repeat if not isempty(stack) then begin popStack(stack, t); dir := t.dir; end; if dir[length(dir)] <> '\' then dir := dir + '\'; FindFirst(dir + fn, AnyFile, search); while dosError = 0 do begin if search.attr <> $10 then begin writeln(search.name:15, (search.size div step) : 10); inc(L[search.size div step]) end; FindNext(search); end; FindFirst(dir + '*.*', Directory, search); while doserror = 0 do begin if (search.attr and 16 <> 0) and (search.name[1] <> '.') then begin t.dir := dir + search.name; pushStack(stack, t); end; (* GetFiles(fn, dir + search.name, L); *) FindNext(search); end; until isempty(stack); end; Procedure Gyst(const arr: array of integer; const size: integer); var i, j, max: integer; mult_by: double; begin ClrScr; max := arr[1]; for i := 1 to pred(size) do if max < arr[i] then max := arr[i]; mult_by := 60 / max; for i := 1 to pred(size) do begin gotoxy(2, 2 + i); write((i*step div 1024):4, 'Kb: '); for j := 1 to Trunc(arr[i]*mult_by) do write(chr(178-byte(odd(i)))); gotoxy(72, 2 + i); write(arr[i]:4); end; end; var i : byte; begin clrscr; FillChar(sizes, sizeof(sizes),0); GetFiles('*.*','C:\', sizes); writeln; Gyst(sizes, Succ(maxDegree)); ReadLn; end.