Guida Pascal
Capitolo 25° - Appendice 6 Cercare un file
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).
C#, TypeScript, java, php, EcmaScript (JavaScript), Spring, Hibernate, React, SASS/LESS, jade, python, scikit, node.js, redux, postgres, keras, kubernetes, docker, hexo, etc...
|