program Adresare; (* Program, ktery v adresarove strukture vyhleda vsechny soubory, ktere odpovidaji zadane masce. Program prohledava pouze soubory s atributy ReadOnly a Archive *) {$M 32768,0,655360} (* Zvetsi pamet pro zasobnik *) uses Crt, Dos; type MyNameStr=string[8]; MyExtStr=string[4]; var s:string; procedure MyFSplit(Path:string; var Dir:string; var Name:MyNameStr; var Ext:MyExtStr); var n,i:integer; begin n:=Length(Path); i:=n; while (i>0) and (Path[i]<>'.') do Dec(i); if i>0 then begin Ext:=Copy(Path,i,n-i+1); Delete(Path,i,n-i+1); end else Ext:=''; n:=Length(Path); i:=n; while (i>0) and (Path[i]<>'\') and (Path[i]<>':') do Dec(i); Name:=Copy(Path,i+1,n-i); Delete(Path,i+1,n-i); if i>0 then Dir:=Path else Dir:=''; end; procedure Projdi(Path:string); var Name:MyNameStr; Ext:MyExtStr; Dir,PathAll:string; DirInfo:SearchRec; Attr:Word; begin (* Prohledani souboru v adresari *) Attr:=ReadOnly or Archive; (* Nastaveni atributu prohl. souboru *) MyFSplit(Path,Dir,Name,Ext); (* Rozdeleni zadane cesty na adresar, jmeno a priponu *) FindFirst(Path,Attr,DirInfo); (* Nalezeni prvniho souboru odpovida jiciho zadanemu kriteriu *) while DosError=0 do (* Pokud takovy soubor byl nalezen, *) begin (* tak provadej *) WriteLn(Dir+DirInfo.Name); (* Vypis nalezeny soubor s jeho adresarem *) FindNext(DirInfo); (* Hledej dalsi soubor *) end; (* Prohledavani podadresaru *) Attr:=Directory; (* Nastaveni atributu pro adresar *) PathAll:=Dir+'*.*'; (* Prohledavej vsechny podadresare *) FindFirst(PathAll,Attr,DirInfo);(* Naleze prvniho podadresare *) while DosError=0 do (* Pokud existuje, tak provadej *) begin if (DirInfo.Name[1]<>'.') and (* Nejedna-li se o podadresar . nebo .. *) ((DirInfo.Attr and Directory)=Directory) (* tak proved rekursivni vyvolani procedury na tento podaresar spolecne se zadanou maskou *) then Projdi(Dir+DirInfo.Name+'\'+Name+Ext); FindNext(DirInfo); (* Najdi dalsi podadresar *) end; end; begin ClrScr; Write('Zadej masku hledanych souboru: '); ReadLn(s); Writeln('Nalezene soubory odpovidajici masce: ',s); WriteLn; Projdi(s); end.