Oppure

Loading
Program cercafile;
Uses Crt,WinDos;
Var nome,dir:string;
    trovato:Boolean;
    DirInfo:TSearchRec;

begin
    clrscr;
    trovato:=false;
    write(‘Nome del file da cercare: ‘);
    read(nome);
    write(‘Directory in cui cercare (nome corto): ‘);
    read(dir);
    ChDir(dir);
    FindFirst(‘*.*’,FaArchive,DirInfo);
    while DosError=0 do
      begin
     if Pos(nome,DirInfo.Name)>0 then
       begin
       trovato:=true;
       break;
       end;
     FindNext(DirInfo);
      end;
    if trovato=true then
      write(‘Il file è stato trovato!’)
    else
      write(‘Il file non è stato trovato!’);
    readln
end.


Il programma legge da tastiera la directory e il nome del file da cercare, poi usa una procedura speciale, FindFirst(ext:const string;type:byte;var data:TSearchRec), che cerca tutti i file di estensione  ext (l’estensione non può essere un dato i introdotto da tastiera, quindi una variabile, ma deve sempre essere specificata dal programmatore come stringa tra apici) e di tipo type (il file di tipo FaArchive sono tutti i file normali, per approfondimenti, vedi appendice 7) e usa la variabile DirInfo per depositare tutti i propri dati.
La struttura iterativa while...do fa si che il ciclo continui se e solo se esistono ancora altri file di estensione ext, mentre la procedura FindNext(var data:TSearchRec) prosegue la ricerca (nel parametro data bisogna specificare la stessa variabile usata nel medesimo parametro nella procedura FindFirst).
Ad ogni step, i dati contenuti nella strutture DirInfo si rinnovano e nel campo Name possiamo trovare il nome del file preso attualmente in esame che corrisponda alla descrizione di estensione e tipo fornita in input da FindFirst. Se la variabile stringa 'nome' è presente come sottostringa nel nome del file, allora il file è stato trovato e il ciclo si interrompe (ovviamente, risulta un solo file con quel nome, ma lascio a voi la raffinazione del programma per scrivere tutti i file trovati). L’istruzione break, spezza il ciclo in cui è contenuta (cioè il costrutto while...do) e balza all’istruzione immediatamente successiva.

Comunque, è fornita dall’unità WinDos una procedura, FileSearch che permette di trovare un file il cui nome sia di tipo pchar (ossia non può essere una variabile). Un piccolo esempio:

(*...*)
var S:array[0..fsPathName] of char;
(*...*)
FileSearch(S,‘Turbo.exe’,GetEnvVar(‘PATH’));
if s[0]=#0 then
  writeln(‘File turbo.exe non trovato!’)
else
  writeln(‘File turbo.exe trovato come’,FileExpand(S,S));
(*...*)


La procedura FileSearch cerca il file turbo.exe nella path corrente e deposita il suo nome nella variabile S, array di char di lunghezza variabile (fsPathName è una variabile globale preimpostata). Se il primo carattere è uguale a #0 (il primo carattere della tabella ASCII, che corrisponde ad un carattere nullo), allora il file non è stato trovato, altrimenti S contiene il suo nome. FileExpand(s,s:array of char) è una funzione che restituisce il nome (esiste anche Fexpand(s:pathstr), che ha lo stesso effetto), completo di path, del file specificato tra parentesi.

Esiste anche una funzione abbreviata di FileSearch, che è FSearch(name,dir:PChar):PathStr, che restituisce direttamente il nome del file e può essere usata, perciò, in operazioni di assegnamento:

var s:pathstr;
(*...*)
s:=FSearch(‘Turbo.exe’,GetEnvVar(‘PATH’));
if s=’’ then
  writeln(‘Il file non è stato trovato!’)
else
  writeln(‘File trovato come ’,Fexpand(s));
(*...*)


Pathstr, come TSEarchRec sono tipi definiti nella libreria WinDos. Pathstr è un tipo che può contenere una path sotto forma di stringa, metre TSearchRec contiene i dati relativi ad una ricerca inizializzata con FindFirst. Mentre PChar, è un tipo molto particolare, che usa i puntatori (argomento molto avanzato, ma che nel C si tratta quasi agli inizi), ossia variabili che contengono l'indirizzo di un'area di memoria, per esprimere una stringa. In questo modo, i PChar non possono essere nè letti nè scritti a video, proprio perchè la loro natura di puntatori lo impedisce (non si può leggere da tastiera un indirizzo, anche se scriverlo sarabbe possibile).
A cura di: Il Totem