Еще один пример использования рекурсии. Описана процедура нахождения файла в текущем каталоге. Внутри происходит проверка атрибута найденого файла и если он является подкаталогом, происходит обращение процедуры самой к себе, с другими параметрами. Необходимо заметить, что в данной процедуре отсутствует проверка на завершение выполнения. Это возможно из-за того, что файловая структура (FAT) подразумевается корректной и конечной. Однако, если вдруг окажется, что FAT содержит ошибку и из дочернего каталога ссылается на какой нибудь из своих родительских каталогов, программа войдет в бесконечный цикл.
{************ }
uses Dos;
var total,totald:longint;
Procedure SearchDisk(mask,cat:string);
var DirInfo: SearchRec;
CurDir:string;
begin
GetDir(0,CurDir);
chdir(cat);
FindFirst(mask, AnyFile, DirInfo);
while DosError = 0 do
begin
if (DirInfo.Name<>'.') and (DirInfo.Name<>'..') then
begin
WriteLn(' fn:',DirInfo.Name:14,' Cat:',cat);
if (DirInfo.Attr = $10) then
begin { directory found }
inc(totald);
if (cat='\')
then SearchDisk(mask,'\'+DirInfo.Name)
else SearchDisk(mask,cat+'\'+DirInfo.Name);
end
else { file found }
inc(total);
end;
FindNext(DirInfo);
end;
chdir(CurDir);
end;
begin
total:=0; totald:=0;
SearchDisk('*.*','\');
writeln('Found: ',totald:5,' directories.');
writeln(' ',total:5,' files.');
end.