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