Reţele intranet‎ > ‎Laboratoare‎ > ‎

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

Operator
Descriere
-b
Este nume un dispozitiv bloc ? (dispozitiv bloc ?)
-c
Este nume un dispozitiv I/O caracter cu caracter ? (dispozitiv I/O ?)
-d
Este nume un director ?
-e
Există nume ca (fişier|director|dispozitiv) ?
-f
Este nume un fişier obişnuit ?
-g
Are nume setat bit-ul setgid ? (setgid ?)
-k
Are nume bit-ul "sticky" setat ? (sticky bit ?)
-l
Reprezintă nume o legatură simbolică ?
-o
Este nume deţinut de utilizatorul curent ?
-p
Reprezintă nume un fişier PIPE ? (fişier PIPE ?)
-r
Este nume accesibil pentru citire ?
-s
Este nume un fişier cu dimensiune nenulă ?
-t
Reprezintă nume un fişier terminal ?
-u
Are nume bit-ul setuid setat ? (setuid ?)
-w
Este nume accesibil pentru scriere ?
-x
Este nume un fişier executabil ?
-z
Este nume un fişier gol ?
-A
Cât timp a trecut de când a fost accesat ultima dată nume ?
-B
Este nume un fişier binar ?
-C
Cât timp a trecut de când inode-ul nume a fost accesat ? (Inode ?)
-M
Cât timp a trecut de la ultima modificare a lui nume ?
-S
Reprezintă nume un fişier socket ?
-T
Reprezintă nume un fişier text ?



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


Comments