|
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 (lestensione 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). Listruzione break, spezza il ciclo in cui è contenuta (cioè il costrutto while...do) e balza allistruzione immediatamente successiva.
Comunque, è fornita dallunità 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).
|
|