Contributor: MICHAEL DAY


{$I-}
{$M 65000,0,1024}
program KillDir;
uses crt,dos;

type String12 = string[12];
var TotalSize : longint;
    ThisSize : longint;

procedure UpString(var S:string);
var i:word;
begin
  for i := 1 to length(S) do
    S[i] := upcase(S[i]);
end;

function AbortIt:boolean;

var ch : char;
begin
  AbortIt := false;
  if not(KeyPressed) then Exit;
  ch := readkey;
  if ch = #0 then ch := chr(ord(readkey) or $80);
  if (ch = ^C) or (ch = ^X) or (ch = ^Q) or (ch = #$1B) then
    AbortIt := true;
end;

function GetSize(var F:file):string12;
var RawSize : longint;
    Size:string;
begin
   Reset(F,1);
   RawSize := FileSize(F);
   Close(F);
   ThisSize := RawSize;
   if IOresult <> 0 then {nop};
   if RawSize < 10000 then
   begin
     str(RawSize,Size);
   end
   else if RawSize < (1024*999) then
   begin

     str(RawSize div 1024,Size);
     Size[length(Size)+1] := 'K';
     inc(Size[0]);
   end
   else
   begin
     str(RawSize div (1000*1024),Size);
     Size[length(Size)+1] := 'M';
     Inc(Size[0]);
   end;
   while length(Size) < 4 do
   begin
     Size := ' '+Size;
   end;
   GetSize := Size;
end;

function SizeIt(Which:string):byte;
var DirInfo:SearchRec;
    f : file;
    Attr,Result:word;
    Size,Who:string12;
    Current:string;
begin
  SizeIt := 1;
  if IOresult <> 0 then {nop};
  GetDir(0,Current);

  chdir(Which);
  if IOresult <> 0 then Exit;
  Who := '*.*';
  findfirst(Who, $3F, DirInfo);
  while DosError = 0 do
  begin
    if AbortIt then
    begin
      SizeIt := 2;
      Exit;
    end;
    if (DirInfo.Name <> '.') and (DirInfo.Name <> '..') then
    begin
      Assign(F,DirInfo.Name);
      GetFAttr(F,Attr);
      if (Attr and Directory) <> 0 then
      begin
        Result := SizeIt(DirInfo.Name);
        SizeIt := Result;
        if Result <> 0 then Exit;
      end
      else
      begin
        SetFAttr(F,0);
        Size := GetSize(F);

        Who := DirInfo.Name+'            ';
        writeln(Current+'\'+Which,'  ',Who,' Size:',Size);
        TotalSize := TotalSize+ThisSize;
      end;
    end;
    FindNext(DirInfo);
  end;
  if IOresult <> 0 then {nop};
  ChDir(Current);
  SizeIt := 0;
end;


var Where:string;
    Current:string;
    Yorn:string;
    Result:word;

begin
  TotalSize := 0;
  writeln;
  Writeln('Directory Sizer V1.01  Written by Michael Day as of 05 Sept 94');
  if ParamCount < 0 then
  begin
    writeln('Format is: FSIZE DIRNAME');

    writeln('This program will find the size of all files and all directories');
    writeln('in and below the directory DIRNAME.');
    halt(1);
  end;

  Where := ParamStr(1);
  UpString(Where);
  if pos(Where,':') <> 0 then
  begin
    writeln('Sorry, you cannot size directories on another drive with this program.');
    writeln('Please move to that drive first.');
    halt(2);
  end;

  if IOresult <> 0 then {nop};
  GetDir(0,Current);
  chdir(Where);
  if IOresult <> 0 then
    Result := 1
  else
    Result := 0;
  chdir(Current);


  if Result = 0 then
  begin

    writeln('This will find the size of ALL files and ALL directories in and below:');
    writeln(Current+'\'+Where);

    Result := SizeIt(Where);
    chdir(Current);

    write('Total size of the directory');
    write(Current+'\'+Where);
    writeln(TotalSize);

    if Result = 2 then
    begin
      writeln('Directory size operation terminated by the user.');
      Halt(3);
    end;
  end;

  if Result = 1 then
  begin
    writeln('Error finding directory: ',Where);
    writeln('The directory probably does not exist.');
    halt(4);
  end;

end.

Here is the short version written for BP7 in DOS:

This program simply lists the names of the files, but you could change the output line do
accumulate sizes just as easily.

program search;

uses dos;
var i:integer;
    d:dirstr; n:namestr; x:extstr;

  procedure helpmsg;
  begin
    writeln('SEARCH filespec [filespec]...');
  end;

  procedure dosearch(const d:string);
  var sr:searchrec;

    procedure dofilesearch;
    begin
      findfirst(d+n+x,archive+readonly,sr);
      while doserror=0 do begin
        writeln(d+sr.name);        { THE output }
        findnext(sr);
      end;
    end;

    procedure dodirsearch;
    begin
      findfirst(d+'*.*',directory,sr);
      while doserror=0 do begin

        if (sr.attr and directory = directory)
        and (sr.name[1]<>'.') then              { ignores "." and ".." }
          dosearch(d+sr.name+'\');
        findnext(sr);
      end;
    end;

  begin {dosearch}
    dofilesearch;
    dodirsearch;
  end;

begin
  if paramcount<1 then helpmsg
  else begin
    for i:=1 to paramcount do begin
      fsplit(paramstr(i),d,n,x);
      dosearch(d);
    end;
  end;
end.