Lucrarea 6

Lucrarea 6

Lucrul cu sistemul de fişiere

Funcţii pentru lucrul cu directoare

mkdir, chdir, rmdir, opendir, readdir, closedir, telldir, seekdir, rewinddir

Lucrul cu sistemul de fişiere presupune crearea de directoare, parcurgerea acestora, schimbarea directorului curent, ştergerea fişierelor sau a directoarelor. Limbajul pune la dispoziţia programatorului mai multe funcţii pentru executarea operaţiilor de mai sus. Vom prezenta prin exemple însoiţe de comentarii aceste funcţii.

# creaza directorul testdir cu drepturile 0755.

# returneaza adevarat sau fals(0). (drepturi fisiere ?)

mkdir("/home/student/Desktop/testdir",0755);

# schimba directorul curent. Returneaza adevarat sau fals(0).

chdir("/home/student/Desktop/testdir");

# sterge directorul gol testdir.

rmdir("/home/student/Desktop/testdir");

Pentru a parcurge un director (afişarea tuturor fişierelor şi subdirectoarelor) se va folosi funcţia opendir împreună cu readdir. Prima funcţie asociază o cale de director unui identificator de director iar a doua funcţie returnează la fiecare apel câte un fişier din directorul deschis. De asemenea, într-un context ARRAY funcţia readdir returnează lista tuturor fişierelor şi directoarelor folosind identificatorul de director deschis. Funcţia closedir închide un descriptor de director. La fel ca în cazul fişierelor, putem folosi funcţia telldir pentru a obţine poziţia curentă într-un director, seekdir pentru a seta poziţia curentă într-un director sau rewinddir pentru a reseta poziţia într-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);

Funcţii pentru lucrul cu fişiere

rename, unlink, link, symlink, readlink, chmod, chown, stat

Am prezentat în lucrările trecute modalităţi de deschidere, citire şi creare de fişiere. Limbajul perl pune la dispoziţia programatorului şi funcţii de redenumire şi ştergere de fişiere. Pentru a schimba numele unui fişier se va folosi funcţia rename. De asemenea dacă se doreşte mutarea unui fişier se poate folosi tot funcţia rename. Pentru ştergerea unui fişier se va folosi funcţia unlink. Ambele funcţii returnează adevarat în caz de succes şi fals sau 0 în caz de eroare. Funcţia unlink, în cazul în care primeşte mai multe fişiere ca argument, returnează numărul de fişiere şterse. Iată câteva exemple:

# redenumeste un fisier

rename("vechi","nou");

# muta fisierul din directorul /tmp in directorul student.

rename("/tmp/fisier1", "/home/student/fisier1");

# sterge fisierul fis_x.

# returneaza adevarat sau fals.

unlink("fis_x");

# sterge o lista de fisiere, returneaza numarul de fisiere sterse.

@lista_fisiere = ("fisier1", "fisier2", "fisier3");

unlink(@lista_fisiere);

# seteaza drepturile 0777 pentru lista de fisiere

# pasata ca argument. (drepturi fisiere ?).

chmod(0777,("fisier1","fisier2","/home/student/fisier4"));

# schimba utilizatorul si grupul pentru lista de fisiere

# pasata ca argument.

chown("student","users",("fisier1","fisier2","fisier4"));

# returneaza informatii despre fisierul pasat ca argument.

@info = stat("/home/student/Desktop");

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 fişiere şi directoare

Limbajul perl pune la dispoziţie un set de operatori de test pentru fişiere şi directoare. Aceşti operatori sunt de forma -[A-Za-z] (minus, urmat de o litera) şi pot returna informaţii utile despre fişierul cu care se apelează. Sintaxa este simplă, se foloseşte operatorul, urmat de o expresie -x expr (de obicei un string reprezentând calea spre un fişier/director). Vom prezenta în continuare câteva exemple urmate de o listă 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

Funcţia stat şi operatorii -A si -M returnează timpul în număr de secunde de la 1 Ianuarie 1970 (Unix time) până la data accesării sau modificării.

Exerciţii:

1.) Scrieţi un program care afisează toate fişierele şi directoarele care încep cu caracterul "." (fişiere ascunse)

2.) Scrieţi un program care parcurge şi afisează recursiv o cale citită de la tastatură.

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);

}