Как сделать поиск файлов на диске/дисках?

Рассмотрим два примера программы поиска файла по всему диску и даже по всем дискам с учетом маски:

Пример 1
Uses DOS,CRT;
var
  Stop:boolean;
Procedure FileFind(Dir,FindName : PathStr);
Procedure SearchDir(Dir : PathStr);
 Var
    SRec : SearchRec;
    i:integer;
 begin
   if Stop then Exit;
   if Dir[Length(Dir)] <> '\' then Dir := Dir+'\';
   ClrEol;
   Write(Dir,#13);
   if KeyPressed then Stop := ReadKey = #27;
 
    FindFirst(Dir + FindName, AnyFile, SRec);
    While DosError = 0 do
      begin
        With SRec do
         if Attr and (VolumeID + Directory) = 0 then
          WriteLn(Dir + Name);
        FindNext(SRec);
      end;
 
   FindFirst(Dir+'*.*', $17, SRec);
   While DosError = 0 do
     begin
       With SRec do
        if (Attr and Directory <> 0) and (Name[1] <> '.') then
         SearchDir(Dir+Name);
       FindNext(SRec);
     end;
 end;
begin
 Stop:=False;
 SearchDir(Dir);
end;
 
function GetCurDrive: Char;
var
  r: Registers;
begin
  r.ah := $19;
  MSDOS(r);
  GetCurDrive := Char(r.al + $41);
end;
 
procedure SetCurDrive(Drive: Char);
var
  r: Registers;
begin
  r.ah := $0E;
  r.dl := Byte(Drive) - $41;
  MSDOS(r);
end;
 
procedure WalkDrives(Name : String);
var
  SaveDrive, Drive, Ch: Char;
begin
  if Pos('.', Name) = 0 then Name := Name + '*.*';
  SaveDrive := GetCurDrive;
  for Ch := 'C' to 'Z' do
  begin
    SetCurDrive(Ch);
    Drive := GetCurDrive;
    if Drive = Ch then
    begin
     FileFind(Drive + ':\',Name);
     if Stop then Break;
    end;
  end;
  SetCurDrive(SaveDrive);
end;
 
begin
  FileFind('C:','*.bak'); {search *.bak in C:}
  WalkDrives('*.pas');    {search *.pas in all drives}
end.
Пример 2
Uses DOS;
Procedure PrintFiles(path,mask:string);
var sr:searchrec;
begin
  findfirst(path+mask,anyfile-directory,sr);
  while doserror=0 do begin
    writeln(path+sr.name);
    findnext(sr);
  end;
end;
 
Procedure SearchFiles(path,mask:string);
var sr:searchrec;
begin
  PrintFiles(path,mask);
  findfirst(path+'*.*',anyfile,sr);
  while doserror=0 do begin
    if (sr.attr and directory=directory) and
       (sr.name<>'.') and (sr.name<>'..') then
      SearchFiles(path+sr.name+'\',mask); { Рекурсивный вызов }
    findnext(sr);
  end;
end;
 
begin
  SearchFiles('C:\','*.PAS');
{  WriteFiles('D:\GAMES\','d??.?e?');
  writeFiles('e:\','*.*');}
end.