Sa invatam MS-DOS
Crearea fisierelor BAT cu ajutorul MS-DOS
Test de Evaluare
Contact
 

Sistemul de operare MS-DOS

    Sa dam cateva exemple de nume de fisiere:
\programe\tp\turbo.exe
\dos\ansi.sys
\autoexec.batfisier1.txttemp\fisier1.aux

In primele trei exemple se observa ca primul caracter al caii este "\", ceea ce inseamna ca se porneste din directorul radacina. Al treilea exemplu reprezinta un fisier aflat chiar in directorul radacina. In ultimele doua exemple, deoarece primul caracter nu este "\", calea porneste din directorul curent. Asa cum am afirmat, pot exista mai multe sisteme de fisiere la un moment dat.
In primul rand, orice calculator contine mai multe dispozitive de stocare - o unitate de disc flexibil si unul sau mai multe discuri hard. In al doilea rand, un disc dur poate fi impartit in mai multe zone independente una de alta (numite partitii), fiecare dintre acestea continand cate un sistem de fisiere, de asemenea independent de celelalte. Trebuie deci gasita o forma de a diferentia fisierele aflate in sisteme de fisiere diferite, deci in structuri de directoare diferite.Solutia adoptata de sistemul DOS este de a denumi fiecare
sistem de fisiere printr-o litera urmata de simbolul ":". Astfel, unitatile de disc flexibil sunt desemnate prin literele a: si respectiv b:, iar discurile dure si apoi unitatile CD-ROM, precum si alte dispozitive de stocare, primesc literele c:, d: etc. Aceasta litera precede denumirea fisierului, precizand astfel in care
sistem de fisiere trebuie cautat fisierul respectiv. Din aceste motive, sistemele de fisiere se mai numesc unitati de disc, iar literele asociate lor, litere de disc. Similar directorului curent, exista si o unitate de disc curenta, avand un rol analog. Practic, toate numele de fisiere (precedate sau nu de calea de directoare
corespunzatoare) de pe unitatea curenta nu au nevoie de a preciza care este unitatea pe care se afla. Mai mult, fiecare unitate are propriul director curent. Desigur, utilizatorul poate decide atat unitatea curenta, cat si directoarele curente pe toate unitatile de disc.
Exemple:c:\files\fisier1.txt numele fisierului este precedat de litera unitatii de disc si de calea de directoare\files\fisier1.txt se precizeaza o cale pe unitatea de disc curent a fisier1.txt fisierul este cautat in directorul curent al unitatii curented:fisier2.doc fisierul este cautat in directorul curent al unitatii d:, deoarece calea care urmeaza dupa litera de disc nu incepe cu simbolul "\", deci nu se porneste din radacina.
Cum realizeaza sistemul de operare gestiunea sistemelor de fisiere, altfel spus, cum este regasit pe disc un fisier despre care in prima instanta se cunoaste doar numele?
Pentru a raspunde la aceasta intrebare trebuie sa urmarim cum isi organizeaza sistemul de operare informatia pe disc. Mai intai se impun cateva consideratii sumare legate de organizarea fizica a discului. Intr-un mod destul de asemanator memoriei, fiecare octet de pe disc este identificat printr-o adresa.
Practic insa, discul este impartit in zone de date de dimensiuni mai mari, numite sectoare (care au in cele mai multe cazuri 512 octeti). Din motive tehnologice, cautarea unui octet pe disc consta din doua etape distincte:- cautarea sectorului din care face parte octetul dorit- cautarea octetului respectiv in sectorul din care face parte In general, prima etapa are o durata mult mai mare. Daca tinem cont ca, in orice
program, cel mai adesea se acceseaza in mod repetat datele invecinate, rezulta ca este mult mai rapid sa citim printr-o singura operatie un grup mai mare de octeti decat sa realizam cate o operatie de citire pentru fiecare dintre acei octeti (desigur, la fel se intampla si la scriere).Din acest motiv, citirile si crierile de date pe disc nu se fac la nivel de octet, ci la nivel de bloc de octeti. Dimensiunea unui asemenea bloc variaza in functie de mai multi factori. Primul sector al uni disc hard contine tabela de partitii. Asa cum am aratat anterior, un disc hard poate contine mai multe zone independente una de alta, numite partitii. Numarul maxim de paritii care pot fi create pe disc este 4 (desi poate fi marit prin anumite mijloace, care nu intereseaza aici), deci tabela are 4 elemente. Fiecare element poate contine informatii despre una dintre partitii, in principal adresele primului si ultimului sector din partitia respectiva (evident, pentru a nu complica prea mult structura, partitiile sunt zone continui de date pe disc). In plus, deoarece la pornirea calculatorului sistemul de operare este incarcat de obicei de pe disc, este marcata partitia care contine sistemul de operare, numita partitie activa. Deoarece dischetele nu pot avea decat o singura partitie, ele nu au tabela de partitii, iar structura unei dischete este identica cu a unei partitii de pe discul hard.Structura unei partitii este urmatoarea:
FAT 1 FAT 2
Sectorul de boot Tabelele de alocare a fisierelor Directorul radacina
Zona de date
Sectorul de boot (sau de autoincarcare) contine un mic program care realizeaza incarcarea in memorie a fisierelor care formeaza sistemul de operare. Acest sector nu este utilizat decat in cazul partitiei active.
Tabelele de alocare a fisierelor (FAT - File Allocation Table) memoreaza modul de ocupare cu informatie a zonei de date a partitiei si sunt identice nu numai in structura, ci si in continut. Sistemul DOS mentine doua copii tocmai pentru a putea restabili informatia in cazul cand una dintre tabele este alterata din diverse motive. Asa cum am vazut, informatia este transferata inspre si dinspre disc in blocuri. La randul sau, sistemul de operare stocheaza fisierele pe disc utilizand ca unitate elementara clusterul, care reprezinta o zona continua formata din unul sau mai multe sectoare, in functie de caracteristicile discului. In acest fel, un fisier va ocupa pe disc mai mult decat dimensiunea sa reala. De exemplu, pentru un disc
la care un cluster are 4 sectoare (deci 2048 octeti), un fisier de 9473 octeti va ocupa pe disc 5 clustere, adica 10240 octeti. Tabela de alocare a fisierelor contine, pentru fiecare cluster de pe partitie, o valoare
care indica una din urmatoarele situatii:
- clusterul nu este alocat (nu contine nici un fel de informatie utila)
- clusterul este defect (eroare fizica pe disc)
- cluster rezervat pentru uzul sistemului de operare
- clusterul contine date ale unui fisier; in acest caz, valoarea din FAT
fie va reprezenta numarul clusterului care contine urmatoarele date ale aceluiasi fisier, fie va marca (printr-o valoare speciala) faptul ca acest cluster contine finalul fisierului.Deci, pentru fiecare fisier exista un lant de clustere care contin datele respectivului fisier. Practic, pentru a putea accesa un fisier in intregime, trebuie cunoscuta numai adresa primului sau cluster si, utilizand informatiile din FAT, se pot determina si clusterele urmatoare. Acest mod de memorare elimina necesitatea ca fisierele sa ocupe zone continui de date pe disc, deoarece datele pot fi regasite si cand fisierul ocupa clustere aflate
in pozitii neinvecinate.
Urmatoarea zona o reprezinta directorul radacina. Acesta, ca si oricare alt director, este de fapt un tabel ale carui elemente, numite si intrari in director, contin informatii despre cate un fisier sau subdirector.
Aceste informatii sunt:
- numele fisierului
- numarul primului cluster ocupat de catre fisier
- dimensiunea fisierului
- data si ora cand a fost creat fisierul etc.
Pornind de la numele unui fisier, sistemul de operare il poate regasi pe disc. Sa luam ca exemplu urmatorul nume (complet) de fisier:
c:\programe\bc\bin\bc.exe
In primul rand se identifica unitatea de disc pe care se face cautarea, in cazul de fata unitatea c:. Daca unitatea de disc nu este precizata, sistemul cauta pe unitatea implicita. In continuare se observa ca, deoarece calea incepe cu simbolul "\", autarea va porni din directorul radacina. In caz contrar, cautarea ar porni din directorul curent al unitatii respective. Evident, este necesar sa fie cunoscuta pozitia pe disc a directorului din care incepe cautarea. Asa cum am aratat, directorul radacina incepe de la o adresa fixa pe disc, cunoscuta de sistem. In ceea ce priveste directorul curent, adresa de inceput a acestuia este retinuta in permanenta de catre sistemul de operare. Deci, in oricare din cazuri, sistemul stie de unde sa inceapa cautarea. Urmeaza inspectarea intrarilor din directorul radacina, pentru a gasi elementul corespunzator subdirectorului programe. Daca nu exista un subdirector cu acest nume in directorul radacina, cautarea este abandonata si sistemul de operare semnalizeaza esecul. Daca s-a gasit subdirectorul, se citeste adresa primului sau cluster si, de la acea adresa, se incepe inspectarea
intrarilor sale pentru a gasi subdirectorul bc. Cautarea continua in acest fel pana cand se intalneste un caz de eroare sau pana cand este gasit fisierul bc.exe. Din acest moment, folosind adresa primului cluster ocupat de fisier si informatiile din FAT, fisierul poate fi accesat dupa dorinta.
Comenzi uzuale ale sistemului MS-DOS
Ca orice sistem ajuns la o anumita vechime, MS-DOS a cunoscut o serie de imbunatatiri de-a lungul timpului, inclusiv adaugarea de noi instructiuni, practic fiecare versiune aducand ceva in plus in acest sens. Totusi, numai cateva dintre aceste instructiuni sunt folosite cu adevarat frecvent. Datorita importantei pe care o are sistemul de fisiere, majoritatea acestor comenzi uzuale se refera la manipularea structurii de directoare si a continutului fisierelor. Iata o scurta prezentare a acestor comenzi:
litera_disc:
Schimba unitatea de disc curenta. Noua unitate curenta este cea a carei litera este inclusa in comanda.
Exemplu:
c: noua unitate de disc curenta este c:
dir
Afiseaza numele si eventual alte informatii despre fisierele si subdirectoarele din directorul curent de pe unitatea curenta de disc sau dintr-un director precizat ca argument al comenzii. Daca se doreste precizarea mai multor nume de fisiere simultan, se pot utiliza in construirea numelor de fisiere
si directoare asa-numitii specificatori de fisier, care sunt simboluri cu semnificatii speciale. Astfel, simbolul "*" poate inlocui 0 sau mai multe caractere din numele unui fisier, iar simbolul "?" (mai rar utilizat) poate inlocui 0 sau 1 caractere dintr-un nume. De asemenea, se pot folosi doua denumiri speciale pentru directoare: "." reprezinta directorul curent al unitatii curente, iar ".." desemneaza directorul parinte al directorului curent (adica directorul care il contine). Se observa ca aceste nume speciale nu pot fi folosite in caile care pronesc din directorul radacina.
Exemple:
dir afiseaza numele tuturor fisierelor si subdirectoarelor din directorul curent
dir . la fel ca si comanda anterioara
dir ..\.. afiseaza numele tuturor fisierelor si subdirectoarelor din directorul parinte al directorului parinte al directorului curent
dir fis1.txt afiseaza numele fisierului fis1.txt din directorul curent, daca acesta exista
dir fis*.bak afiseaza numele tuturor fisierelor din directorul curent al caror nume incepe cu fis si care au extensia bak
dir fisier.t? afiseaza numele tuturor fisierelor din directorul curent care au numele fisier si a caror extensie incepe cu litera t, urmata de cel mult inca un caracter
dir c:\programe\bc afiseaza numele tuturor fisierelor si subdirectoarelor din directorul c:\programe\bc
dir programe\bc\*.exe afiseaza numele tuturor fisierelor cu extensia exe din directorul programe\bc, unde programe este un subdirector al directorului curent
Comnada dir, la fel ca si majoritatea celorlalte, are si o serie de optiuni care controleaza informatiile despre fisiere care sunt afisate; in general insa, modul implicit de afisare ne ofera suficiente informatii, astfelincat nu ne vom opri asupra optiunilor.
mkdir (md)
Dupa cum se observa, comanda are doua forme, identice in ceea ce priveste comportamentul. Efectul comenzii este crearea unui nou director, ale carui nume si pozitie in structura de directoare sunt precizate de catre utilizator printr-un argument obligatoriu.
Exemple:
mkdir temporar creaza directorul temporar ca un subdirector al directorului curent
md \programe\tp creaza directorul tp ca un subdirector al directorului programe, aflat in directorul radacina al unitatii curente; directorul programe trebuie sa existe deja md d:\document\situatii creaza directorul situatii ca un subdirector al directorului d:\document, care trebuie sa existe deja
rmdir (rd)
Sterge (elimina din structura de directoare) directorul al carui nume este dat ca argument al comenzii. Acest director nu va putea fi sters decat daca nu contine nimic (nici fisiere, nici subdirectoare). Posibilitatile de precizare a numelui directorului de sters sunt aceleasi ca in cazul comenzii anterioare.
chdir (cd)
Schimba directorul curent; altfel spus, desemneaza ca director curent acel director care este precizat ca argument al comenzii. Daca nu este precizat nici un argument, comanda afiseaza litera de disc, calea si numele directorului curent.
Exemple:
cd .. noul director curent al unitatii curente va fi directorul parinte al actualului director curent
cd tmp noul director curent va fi directorul tmp, care este un subdirector al actualului director curent
cd \programe\bc\bin noul director curent va fi \programe\bc\bin
cd d:\document\texte schimba directorul curent al unitatii d:, fara a schimba si unitatea de disc curenta
copy
Copie unul sau mai multe fisiere in acelasi director sau in altul, eventual aflat pe o alta unitate de disc. Fisierele destinatie pot pastra numele fisierelor initiale sau pot primi nume noi. Comanda nu realizeaza si copiereadirectoarelor.
copy a.txt \docs\f.txt copie fisierul a.txt din directorul curent in directorul \docs, intr-un fisier numit f.txt
copy *.bat c:\dos copie toate fisierele cu extensia bat din directorul curent in directorul c:\dos, pastrandu-le numele
copy d:\programe\bc\*.* copie toate fisierele din directorul d:\programe\bcin directorul curent (aceasta este destinatia implicita, deci nu mai trebuie precizata)
copy c:\config.sys a:\ copie fisierul c:\config.sys in directorul radacina al discului a:
del (erase)
Sterge unul sau mai multe fisiere.
Exemple:
del fisier.aux sterge fisierul cu numele fisier.aux din directorul curent del *.bak sterge toate fisierele cu extensia bak din directorul curent del c:\document\*.* strege toate fisierele din directorul c:\document
ren
Redenumeste un fisier, dandu-i un nume nou, precizat ca argument al comenzii.
Comanda nu poate redenumi mai multe fisiere simultan si nici nu poate muta fisierul in alt director.
Exemple:
ren a.txt b.txt schimba numele fisierului a.txt din directorul curent in b.txt
ren c:\files\f1.txt f2.txt schimba numele fisierului c:\files\f1.txt in f2.txt, lasandu-l in acelasi director
Incarcarea sistemului MS-DOS. Fisiere sistem
Asa cum se afirma adesea, sistemul de operare este incarcat de pe disc - uneori de pe o discheta, cel mai adesea de pe discul hard. Trebuie insa sa existe un program care sa realizeze aceasta operatie, program care sa fie apelat la pornirea calculatorului. In continuare vom urmari pasii pe care ii executa sistemul de calcul la punerea sub tensiune.
1. In primul pas se executa un program care este stocat intr-un circuit de memorie nevolatila, de tip ROM, existent in calculator. Aceasta memorie, numita ROM-BIOS, contine si alte informatii, fiind vitala pentru functionarea sistemului. Deoarece procesorul poate accesa memoria in mod direct, fara ajutorul unor programe specializate (asa cum este necesar in cazul accesului la periferice), acest program poate fi executat direct.
De unde stie insa procesorul chiar de la punerea sub tensiune sa execute acest program, altfel spus cum ajunge sa execute instructiuni incepand chiar de la adresa unde se gaseste programul? Orice procesor este astfel construit incat la punerea sub tensiune sa inceapa sa execute instructiunile aflate in memorie incepand de la o anumita adresa, care este fixa. De exemplu, toate procesoarele firmei Intel, indiferent de generatia din care fac parte, pornesc de la aceeasi adresa; acesta este unul dintre
aspectele compatibilitatii intre procesoare diferite. Sarcina constructorului calculatorului este sa plaseze circuitul de memorie care contine programul in cauza astfel incat programul sa inceapa de la adresa de start a procesorului. Acest program nu este necesar sa fie modificat in timp, de aceea nu este o problema stocarea sa intr-o memorie de tip ROM, al carei continut nu poate fi schimbat. Programul respectiv realizeaza mai intai o testare a componentelor calculatorului, iar daca intalneste erori blocheaza calculatorul. In general erorile detectate de acest program sunt grave, astfel incat intr-un asemenea
caz va fi necesara cel mai adesea inlocuirea unor componente. Dupa trecerea cu succes a autotestului, progarmul realizeaza anumite initializari ale sistemului, apoi cauta un disc de pe care se poate incarca
sistemul de operare. In general este testata mai intai unitatea de discheta si abia dupa aceea discul hard, dar ordinea poate fi schimbata la calculatoarele mai noi. Daca exista o discheta in unitate, va fi explorat primul sector al dischetei. In cazul discului hard este citita intai tabela de partitii, pentru a se determina care este partitia activa, apoi este accesat primul sector al acelei partitii. Din acest moment lucrurile se desfasoara la fel atat pentru discheta, cat si pentru discul hard.
2. In primul sector al discului se gaseste un program de incarcare caracteristic sistemului MS-DOS. Acest incarcator este adus in memorie si lansat in executie. Prima sa actiune este de a incarca de pe disc fisierul IO.SYS, care contine informatii cu ajutorul carora se poate realiza accesarea corecta a peirfericelor. In plus, fisierul IO.SYS contine un alt program de incarcare, care se va executa in continuare. Acest incarcator este mai avansat decat cel anterior, intrucat, o data cu initializarile facute
cu ajutorul informatiilor din fisierul IO.SYS, este posibila utilizarea structurii logice a discului pentru a-l accesa.
Observatie:
Asa cum se poate constata, la momentul incarcarii fisierului IO.SYS nu este posibila accesarea structurii logice a discului. Pentru a putea fi totusi gasit, fisierul IO.SYS trebuie plasat pe disc la o anumita adresa
fizica fixa. Din acest motiv, la instalarea sistemului DOS pe un disc, fisierul IO.SYS (la fel ca si MSDOS.SYS, care va fi prezentat in continuare) nu poate fi transferat prin comanda copy, care lucreaza cu discul la nivel logic, ci prin comanda sys.
3. Incarcatorul din IO.SYS citeste in memorie fisierul MSDOS.SYS, care contine nucleul sistemului MS-DOS. Din acest moment, sistemul de operare este aproape complet functional, etapele care urmeaza realizand doar anumite initializari care sunt foarte utile, dar nu indispensabile.
4. Este citit continutul fisierului CONFIG.SYS, care indica incarcarea unor dirvere de dispozitiv suplimentare. Spre deosebire de fisierele prezentate anterior, CONFIG.SYS poate lipsi si, in plus, poate fi modificat de catre utilizator.
5. Este incarcat si lansat un program numit interpretor de comenzi, care are sarcina de a asigura comunicarea (interfata) intre sistem si utilizator. Concret, interpretorul de comenzi asteapta primirea unei comenzi de la tastatura si lanseaza respectiva comanda in executie, apoi, la terminarea executiei comenzii, asteapta o noua comanda. Acest proces este reluat pe toata durata functionarii calculatorului. Interpretorul de comenzi implicit este continut in fisierul COMMAND.COM, dar utilizatorul poate impune utilizarea altui interpretor, care trebuie declarat in CONFIG.SYS.
6. Este citit fisierul (optional) AUTOEXEC.BAT; daca exista, acest fisier contine o serie de comenzi despre care utilizatorul doreste sa fie executate intotdeauna la pornirea calculatorului, inaintea oricarei comenzi date de la tastatura. Din acest moment, incarcarea sistemului de operare este completa, iar
toata functionarea calculatorului se rezuma la executia comenzilor date de utilizator.
Lansarea comenzilor in executie
In sistemul de operare DOS exista mai multe tipuri de comenzi:
- comenzi interne interpretorului de comenzi, pe care acesta le executa direct; toate comenzile rezentate in subcapitoul 3.2 sunt comenzi interne interpretorului COMMAND.COM
- programe continute in fisiere avand una din extensiile com sau exe; asemenea fisiere sunt de obicei obtinute prin compilarea unor programe scrise in diverse limbaje de programare (Pascal, C etc.)
- secvente de comenzi, continute in fisiere cu extensia bat; un asemenea fisier poate fi realizat cu ajutorul oricarui editor de text si contine mai multe comenzi de orice tip (inclusiv alte fisiere bat), intr-o anumita ordine; aceste fisiere sunt utile atunci cand trebuie sa executam in mod repetat anumite secvente de comenzi si dorim sa simplificam lansarea de la tastatura.
Exemplu: Consideram ca avem un program, memorat intr-un fisier numit screen.exe, care afiseaza anumite date pe ecran. Din anumite motive, pentru a putea vizualiza in mod optim informatiile afisate de respectivul program, trebuie sters ecranul inainte de lansarea programului respectiv.
Pentru stergerea ecranului exista comanda interna cls. In plus, dupa terminarea sa, programul lasa in directorul curent o serie de fisiere cu extensia tmp, care sunt inutile si trebuie sterse. Deci, de fiecare data cand dorim sa lansam programul, trebuie de fapt sa tastam trei comenzi:
cls
screen.exe
del *.tmp

Daca dorim sa evitam a scrie de fiecare data aceste comenzi, putem realiza un fisier text, numit de exemplu afis.bat, al carui continut va consta exact din cele trei linii de mai sus. Din acest moment, putem lansa o singura comanda, avand efectul dorit, si anume:
afis.bat
Pentru a simplifica si mai mult sarcina utilizatorului, in cazul fisierelor executabile, la lansarea in executie este suficienta precizarea numelui fisierului respectiv, fara a fi neaparat necesara extensia. Astfel, pentru
exemplu de mai sus, se poate lansa mai simplu comanda:
afis
iar continutul fisierului poate fi urmatorul:
cls
screen
del *.tmp

Exista insa si o problema datorata acestei simplificari: daca exista, de exemplu, doua fisiere executabile cu numele screen.exe si screen.com, care dintre acestea va fi lansat in executie cand se tasteaza comanda screen? Mai general, se pune problema de a identifica in structura de directoare fisierul care trebuie lansat in executie atunci cand este data o comanda.
In afara comenzilor interne, care pot fi executate intotdeauna, o comanda nu se poate executa decat daca fisierul in care este memorata se gaseste in directorul curent sau daca este precizata pozitia sa exacta in structura de directoare.
Exemple:
screen.exe se lanseaza in executie fisierul screen.exe din directorul curent c:\programe\screen.exe se lanseaza in executie fisierul screen.exe din directorul c:\programe
Un asemenea mod de lucru este insa foarte incomod: ar trebui ca, de fiecare data cand lansam in executie un program care nu se afla in directorul curent, sa indicam si calea pe care poate fi gasit acesta. Pentru a veni in ajutorul utilizatorului, sistemul DOS a introdus o comanda numita path, care se apeleaza in modul urmator:
path nume_director1;nume_director2;...
Ca efect, orice fisier lansat in executie este cautat nu doar in directorul curent, ci si in directoarele din lista data ca argument comenzii path.Aceste directoare trebuie obligatoriu precedate de litera unitatii de
disc careia ii apartin si de calea pe care se afla.
Exemplu:
path c:\dos;c:\windows;c:\programe\bc\bin
Putem acum da un raspuns complet la problema de la care am pornit: se da o comanda de la tastatura, sub forma unui sir de caractere, si trebuie sa se determine ce program se va executa. Pasii sunt urmatorii:
- se verifica daca exista o comanda interna al carei nume este chiar sirul de caractere dat de la tastatura; daca raspunsul este afirmativ, comanda este executata de catre interpretorul de comenzi; in caz contrar trebuie cautat un fisier executabil pe disc;
- se determina directoarele in care se va face cautarea: daca sirul de caractere contine o cale de directoare, cautarea se va face numai in directorul cu care se termina acea cale; in caz contrar, cautarea se va face intai in directorul radacina, apoi (daca mai este necesar) in directoarele precizate in comanda path, in ordinea in care acestea au fost indicate
- daca numele fisierului precizat in sirul de caractere contine si o extensie (com, exe sau bat), se cauta in directoarele determinate anterior un fisier avand numele si extensia respective; daca este gasit, este lansat in executie
- daca numele fisierului nu contine nici o extensie, se parcurg pe rand directoarele determinate anterior, cautandu-se un fisier avand numele dat prin comanda si extensia com, exe sau bat, in aceasta ordine; primul asemenea fisier gasit este lansat in executie;
- daca nu s-a gasit nici un fisier care sa corespunda cerintelor, se afiseaza un mesaj de eroare si se asteapta o noua comanda.

prev