Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Guida Pascal - Appendice 6 Cercare un file

Guida Pascal

Capitolo 25° - Appendice 6 Cercare un file

<< Precedente Prossimo >>
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).
<< Precedente Prossimo >>
A proposito dell'autore

Programmatore e analista .NET 2005/2008/2010 (in particolare C# e VB.NET), anche nell'implementazione Mono per Linux. Conoscenze approfondite di Pascal, PHP, XML, HTML 4.01/5, CSS 2.1/3, Javascript (e jQuery). Conoscenze buone di C, LUA, GML, Ruby, XNA, AJAX e Assembly 68000. Competenze basilari di C++, SQL, Hlsl, Java.