Sunteți pe pagina 1din 4

Lucrarea 6

Lucrul cu sistemul de fisiere

Functii pentru lucrul cu directoare mkdir, chdir, rmdir, opendir, readdir, closedir, telldir, seekdir, rewinddir

Lucrul cu sistemul de fisiere presupune crearea de directoare, parcurgerea acestora, schimbarea directorului curent, stergerea fisierelor sau a directoarelor. Limbajul pune la dispozitia programatorului mai multe functii pentru indeplinirea obiectivelor de mai sus. Vom prezenta prin exemple insotite de comentarii aceste functii.

mkdir("/home/student/Desktop/testdir",0755); # creaza directorul testdir cu drepturile 0755. Returneaza adev chdir("/home/student/Desktop/testdir"); # schimba directorul curent. Returneaza adevarat sau fals(0). rmdir("/home/student/Desktop/testdir"); # sterge directorul gol testdir.

Pentru a parcurge un director (afisarea tuturor fisierelor si subdirectoarelor) se va folosi functia opendir impreuna cu readdir. Prima functie asociaza o cale de director unui identificator de director iar a doua functie returneaza la fiecare apel cate un fisier din directorul deschis. De asemenea, intr-un context ARRAY functia readdir returneaza lista tuturor fisierelor si directoarelor folosind identificatorul de director deschis. Functia closedir inchide un descriptor de director. La fel ca in cazul fisierelor, putem folosi functia telldir pentru a obtine pozitia curenta intr-un director, seekdir pentru a seta pozitia curenta intr-un director sau rewinddir pentru a reseta pozitia intr-un director.

opendir(DIR, "/home/student") || warn("Could not open directory"); my @lista_directoare = readdir(DIR); foreach my $l (@lista_directoare) { print "DIR " if (-d $l); print "$l\n"; } closedir(DIR);

Functii pentru lucrul cu fisiere rename, unlink, link, symlink, readlink, chmod, chown, stat

Am prezentat in lucrarile trecute modalitati de deschidere, citire si creare de fisiere. Limbajul perl pune la dispozitia programatorului si functii de redenumire si stergere de fisiere. Pentru a schimba numele unui fisier se va folosi functia rename. De asemenea daca se doreste mutarea unui fisier se poate folosi tot functia rename. Pentru stergerea unui fisier se va folosi functia unlink. Ambele functii returneaza adevarat in caz de succes si fals sau 0 in caz de eroare. Functia unlink, in cazul in care primeste mai multe fisiere ca argument, returneaza numarul de fisiere sterse. Iata cateva exemple:

rename("numevechi","numenou"); #redenumeste un fisier rename("/home/student/Desktop/fisier1", "/home/student/fisier1"); #muta fisierul din directorul Desktop in directorul student. unlink("fisier_x"); #sterge fisierul, returneaza adevarat sau fals. @lista_fisiere = ("fisier1", "fisier2", "fisier3"); unlink(@lista_fisiere); #sterge o lista de fisiere, returneaza numarul de fisiere sterse. chmod(0777,("fisier1","fisier2","/home/student/fisier4")); #seteaza drepturile 0777 pentru lista de fisiere pasata ca argument. (drepturi fisiere ?) chown("student","users",("fisier1","fisier2","/home/student/fisier4")); #schimba utilizatorul si grupul pentru lista de fisiere pasata ca argument. @info = stat("/home/student/Desktop"); # returneaza informatii despre fisierul pasat ca argument.

Functiile link si symlink creaza legaturi hard sau simbolice la fisiere in sisteme UNIX. Functia readlink returneaza fisierul la care pointeaza numele pasat ca argument (daca acesta este un fisier legatura). Functiile chmod si chown seteaza(schimba) drepturile de acces sau utilizatorul unei liste de fisiere (doar pentru sisteme UNIX). Functia stat returneaza o lista cu diferite informatii despre fisierul pasat ca argument. Aceste informatii sunt: dispozitivul pe care se afla fisierul, numarul inode al fisierului, setul de drepturi, numarul de legaturi inspre acel fisier, identificatorul numeric al utilizatorului, identificatorul numeric al grupului, data ultimei modificari, ultimei accesari, etc. Pentru lista completa (si exacta) a parametrilor returnati verificati manualul functiei stat (perldoc -f stat).

Operatori de test pentru fisiere si directoare

Limbajul perl pune la dispozitie un set de operatori de test pentru fisiere si directoare.

Acesti operatori sunt de forma -[A-Za-z] (minus, urmat de o litera) si pot returna informatii utile despre fisierul cu care se apeleaza. Sintaxa este simpla, se foloseste operatorul, urmat de o expresie -x expr (de obicei un string reprezentand calea spre un fisier/director). Vom prezenta in continuare cateva exemple urmate de o lista a acestor operatori.
$f = "file1"; if (-e $f) { print "Fisierul $f exista.\n"; } if (!-e $f . "x") { print "Fisierul nu exista.\n"; } if (-x $f) { print "Fisierul $f este executabil.\n"; } $d = "dir1"; if (-d $d) { print "Argumentul $d este un director.\n"; }

Lista operatorilor uzuali -(operator) nume Operator -b -c -d -e -f -g -k -l -o -p -r -s -t -u -w -x -z -A -B Descriere Este nume un dispozitiv bloc ? (dispozitiv bloc ?) Este nume un dispozitiv I/O caracter cu caracter ? (dispozitiv I/O ?) Este nume un director ? Exista nume ca (fisier|director|dispozitiv) ? Este nume un fisier obisnuit ? Are nume setat bit-ul setgid ? (setgid ?) Are nume bit-ul "sticky" setat ? (sticky bit ?) Reprezinta nume o legatura simbolica ? Este nume detinut de utilizatorul curent ? Reprezinta nume un fisier PIPE ? (fisier PIPE ?) Este nume accesibil pentru citire ? Este nume un fisier cu dimensiune nenula ? Reprezinta nume un fisier terminal ? Are nume bit-ul setuid setat ? (setuid ?) Este nume accesibil pentru scriere ? Este nume un fisier executabil ? Este nume un fisier gol ? Cat timp a trecut de cand a fost accesat ultima data nume ? Este nume un fisier binar ?

-C -M -S -T

Cat timp a trecut de cand inode-ul nume a fost accesat ? (Inode ?) Cat timp a trecut de la ultima modificare a lui nume ? Reprezinta nume un fisier socket ? Reprezinta nume un fisier text ?

Functia stat si operatorii -A si -M returneaza timpul in numar de secunde de la 1 Ianuarie 1970 (Unix time) pana la data accesarii sau modificarii.

Exercitii:
1.) Scrieti un program care afiseaza toate fisierele si directoarele care incep cu caracterul "." (fisiere ascunse) 2.) Scrieti un program care parcurge si afiseaza recursiv o cale citita de la tastatura. func($ARGV[0]||'.'); sub func { my $x = shift; opendir(DIR, "$x"); my @bla = readdir(DIR); foreach $p (@bla) { next if ($p eq '..' or $p eq '.'); if (-d $x.'/'.$p) { print "DIR: $x/$p\n"; &func($x.'/'.$p); } else { print $x.'/'.$p,"\n"; } } closedir(DIR); }