{
 PO>    How is one supposed to search for files? For example there is a DOS
 PO> function for finding the next file and some others, but I tried those and
 PO> they need a DTA (disk x-fer area). I've tried to generate my own DTA but
 PO> it never works.

Here's a program I wrote sometimes ago to search files through a hard disk.
You can also redirect output to a file!
}

USES Dos, Crt;

{$M $A000, 0, 0}

TYPE
DIRT   = STRING[127];

CONST
Atr    = $10; { Scan only Directories (system, read only and hidden) }


VAR
ActualDir               : DIRT;
drv                     : STRING[2];
FileDir                 : DIRT;
File_To_Search_For      : STRING[12];
TotalSize               : LONGINT;
NbFiles                 : LONGINT;
F                       : Text;
outp, quit              : boolean;
ch                      : char;

PROCEDURE ScanFor(direc : DIRT);
VAR
FileS   : SEARCHREC;
pth     : PATHSTR;
Diro    : DIRSTR;
Nme     : NAMESTR;
Ext     : EXTSTR;


BEGIN
  FindFirst(direc+'\'+File_To_Search_For, AnyFile, FileS);

  While DosError=0 Do Begin
    IF (FileS.Name <> '.') AND (FileS.Name <> '..') Then Begin
      {pth:=FileS.Name;
      fSplit(pth, Diro, Nme, Ext);}
      Write(direc+'\'+FileS.Name);
      if outp then WriteLn(f, direc+'\'+FileS.Name);
      GotoXY(60, WhereY);
      WriteLn(FileS.Size);
      INC(TotalSize, FileS.Size);
      INC(NbFiles);
    End;
    FindNext(FileS);
  End;
END;

PROCEDURE ScanDir(ddr : DIRT);
VAR
S               : SEARCHREC;

BEGIN
 { WriteLn(ddr); }

  ChDir(ddr);

  ScanFor(ddr);

  FindFirst('*.*', AnyFile, S);

  While (DOSERROR=0) Do Begin

    IF S.Attr=$10 Then Begin
       IF (S.Name <> '.') AND (S.Name <> '..') Then Begin
         IF Length(ddr)>3 then ScanDir(ddr+'\'+S.Name) ELSE
ScanDir(ddr+S.Name);         ChDir(ddr);
       End;
    End;

    if keypressed then begin
      ch:=readkey;
      if ch=#27 then quit:=true;
    end;

    if quit then exit;

    FindNext(S);
  End;
END;


PROCEDURE DoIt;
BEGIN
  quit:=false;
  TotalSize:=0;
  NbFiles:=0;
  File_To_Search_For:=ParamStr(1);
  if paramcount=2 then outp:=true else outp:=false;
  WriteLn('File output : ', outp);
  If outp then begin
    assign(f, paramstr(2));
    rewrite(f);
  end;

  WriteLn('Searching : ');
  WriteLn;
  FileDir:='';

  GetDir(0, ActualDir);

  drv:=''; {Copy(ActualDir, 1, 2);  }

  ScanDir(actualdir);

  If quit then begin
      writeln;
      writeln('Research aborted by user with ESC...');
  end;
  ChDir(ActualDir);

  WriteLn(NbFiles, ' files listed in ', TotalSize, ' Bytes.');
  WriteLn(DiskFree(0), ' free bytes.');
  if outp then close(f);
END;



BEGIN
  WriteLn;
  WriteLn('þ Search For v1.0    By Discovery/EfS! (c)1994');
  WriteLn;
  IF ParamCount=0 Then Begin
    WriteLn('þ Syntax : SF [FileName] [OutPut]');
    WriteLn;
    WriteLn('þ Where [FileName] will be searched on all directories of');
    WriteLn('  current drive from current directory. ');
    WriteLn('  [FileName] Accept WildCards (*, ?)');
    WriteLn;
    WriteLn('  If [Output] is specified, display is copied to file[output],');
    WriteLn('  wihtout size... Very useful to create modules lists:)');
    WriteLn;
  End ELSE DoIt;
END.
