Operații de bază cu sistemul de fișiere unix

Aprobarea totul este un fișier. constituind UNIX® filosofie înseamnă că lucrul cu fișiere și directoare are loc în mod constant, indiferent de aplicare se efectuează în prezent de lucru. Toate datele sunt stocate în fișiere: de data la fișierele de configurare și datele privind dispozitivele și caracteristicile care sunt conținute în fișierul stdio.h antet de sistem, veți ști în câteva ore de programare sub UNIX.

Selectați metoda prin care puteți naviga prin directoare și manipula fișiere, directoare, și link-uri simbolice găsite în ea, este o problemă comună cu care se confruntă novice UNIX-programatori. Cum pot obține conținutul lista de directoare și a determina ce înseamnă?

(. A se vedea Descărcări) cod de program de formare prezentat în acest articol, a fost scris în Eclipse 3.1 mediu folosind extensia C / C ++ Instrumente de dezvoltare (CDT); proiect proiect readdir_demo este un proiect de fabricat tip Managed, colectate utilizând regulile de generare a programului CDT. Makefile lipsește în proiect, dar este atât de ușor că, dacă aveți nevoie pentru a compila un program in afara de Eclipse, a crea un Makefile destul de ușor.

Eclipse mediu (a se vedea resurse.) - este o mare IDE (mediu de dezvoltare integrat, IDE), care, cu fiecare nouă versiune devine mai bine. Miercuri a fost creat de către dezvoltatori EMACS și Makefile. Dacă până acum nu ați folosit Eclipse, trebuie să încercați.

Obținerea conținutului de director

Funcția de dirent.h fișier antet: opendir (). readdir () și closedir () - aceasta este ceea ce avem nevoie în această situație. Utilizarea lor este foarte similară cu utilizarea funcțiilor deschise / citire / închidere atunci când se lucrează cu fișiere, dar cu o singură excepție: readdir () returnează un pointer la o structură specifică (DIRENT struct tip) pentru fiecare intrare director. Plimbare directorul de conținut, puteți utiliza pseudo-codul din Listarea 1.

Listarea 1. Citirea conținutului unui director

opendir () și readdir () returnează NULL. în cazul în care există nici o problemă, iar errno variabila globală este înregistrată cauza a problemei. Dacă readdir () returnează NULL și errno este 0 (sau, într-un alt mod, sau ENOERROR EOK), aceasta înseamnă că catalog nu mai înregistrări.

Trebuie remarcat faptul că fiecare director conține intrări „“ (Un pointer la directorul în sine) și „“ (Un pointer la directorul părinte). În funcție de sarcinile din prelucrarea acestor două înregistrări, este posibil să fi pierdut.

Rețineți că funcția readdir () nu este filetat, ca structură returnată este o variabilă statică, care este stocată în biblioteca de funcții. Cele mai multe sisteme bazate pe UNIX moderne suportă funcția multithreading readdir_r (). care poate fi folosit în loc de a scrie un cod multi-threaded.

Ceea ce este în structura struct DIRENT?

standardul POSIX 1003.1 definește un singur element necesar al structurii struct DIRENT - o matrice de char numit d_name. Acesta este numele de director al elementului sub forma unui standard siruri de caractere NUL-terminate. Orice altceva în structura depinde de sistemul UNIX.

Orice altceva. care este în DIRENT struct. Nu este portabil. Sistemele compatibile nu pot avea și alte elemente în structura. Atunci când creați cod care utilizează membri suplimentari ai acestei structuri, aveți nevoie pentru a marca aceste elemente să fie intolerabilă, și ar trebui să includă în mod ideal în codul de proiect care face aceeași operație, dar fără elementele suplimentare în DIRENT struct.

De exemplu, multe UNIX-sisteme conțin d_type domeniu și unele constante suplimentare, care permit să cunoască tipul de intrare director, fără a apela Stat (). În plus față de eliminarea necesității, din nou, pentru a apela o funcție este extensie de nesuportat evită ia o mulțime de resurse cerere la sistemul de fișiere de metadate detaliate. Stat () funcția pe majoritatea sistemelor bazate pe UNIX care rulează lent.

Obținerea informațiilor despre fișier

În plus față de numele de fișier într-un director ar putea avea nevoie de câteva informații suplimentare, care ar fi clarificat în ce să facă în continuare. Cel puțin, nu se poate distinge doar de numele fișierului din directorul.

Stat () funcția umple structura struct stat cu informații despre un anumit fișier; în cazul în care există un descriptor de fișier în loc de un nume de fișier, îl puteți folosi împreună cu un fstat (). Dacă aveți nevoie, de asemenea, pentru a detecta link-uri simbolice, utilizați lstat () cu numele fișierului.

Spre deosebire de DIRENT struct. returnat de readdir (). struct stat are câmpuri obligatorii destul de mult standard:

  • permisiunile de fișiere (utilizator, grup, altele) și steaguri - st_mode.
  • st_ino - numărul de serie al fișierului.
  • st_dev - dispozitivul pe care se află fișierul.
  • st_nlink - Am contoriza numărul de link-uri.
  • identificator de utilizator fișier-proprietar - st_uid.
  • st_gid - ID proprietar al grupului.
  • st_size - dimensiunea fișierului în octeți (pentru fișiere obișnuite).
  • st_atime - timpul ultimului acces la dosar.
  • st_mtime - timpul ultimei modificări.
  • st_ctime - timpul de creare de fișiere.

Utilizarea S macro _ * () pentru st_mode câmp. Puteți determina tipul de fișier:

Funcția Stat () se realizează destul de încet pe cele mai multe sisteme de fișiere, astfel încât acesta va stoca aceste informații în memorie, în cazul în care aveți nevoie de ea mai târziu.

Unele aplicații, cum ar fi ls și software-ul de backup ar trebui să fie în măsură să afișeze informații despre link-ul simbolic în sine, cum ar fi ce fișier îl indică. Un rezultat similar poate fi realizat folosind lstat () în loc de stat (); Această metodă este utilă în cazul în care aveți nevoie pentru a lucra cu link-ul simbolic, nu fișierul în care.

Partajarea readdir () și Stat ()

Mai sus sa arătat cum să folosească readdir () și Stat () pentru informații cu privire la conținutul directorului. Demonstrați cod de program, care ilustrează aplicarea acestor funcții.

Codul de mai jos, răsfoiți unul sau mai multe directoare specificate în linia de comandă, și afișează unele informații cu privire la toate elementele care sunt în directorul au fost găsite. Când găsește un director diferit, procesează în acest fel. Fișierele țintă de ieșire indicat de link-uri simbolice și dimensiunea fișierelor regulate. Fișierele speciale sunt ignorate.

Așa cum se arată în Listarea 2. Această aplicație proces simplu utilizează toate fișierele antet. specificate la etaj fișiere standard care utilizează toate programele, iar ultimele patru fișiere sunt necesare pentru a utiliza acest program de readdir () și Stat ().

Listarea 2. Fișierele antet

Funcția process_directory () (care începe activitatea în Listarea 3 și se termină în Listarea 6) scanează directorul specificat și afișează câteva informații despre fiecare element de conținut. DIR indicatorul. returnat de opendir (). este identic cu pointerul fișierului (File), care returnează funcția fopen (); aceasta depinde de tipul de obiect sistem de operare care este folosit pentru a urmări fluxul de director ar trebui să ignore conținutul indicatorul DIR.

Listarea 3. Director de prelucrare

După deschiderea directorul specificat este necesară pentru a provoca readdir_r () (Listarea 4) pentru a primi primul element al directorului; fiecare readdir_r apelului ulterior () returnează următorul element până când, până la sfârșitul catalogului și entryPtr nu va fi atins este setat la NULL. Ar trebui să utilizați, de asemenea, strncmp (). pentru a ignora elementele. „Și“. „În cazul în care nu este nevoie pentru a sări peste prelucrarea acestor elemente, prelucrarea directorul va fi realizată pe termen nelimitat (de exemplu,“ theDir /./././././././././.“, Și așa mai departe).

Listarea 4. Pregătirea element separat

Dacă elementul este un director, apoi process_directory apel recursiv () și numărul total de elemente detectate pentru el pentru a adăuga nou găsit. Dacă elementul este un nume de fișier și dimensiunea sa de ieșire (dimensiunea preluată din câmpul st_size struct structura Stat).

Listarea 5. Manipularea unui element separat

La sfârșitul ciclului de timp se realizează citirea și procesarea unei alte intrări de director (Listing 6). În cazul în care procesarea de intrare director este completă, directorul de lucru curent este închis și returnează numărul de elemente care au fost procesate.

Listarea 6. Citirea unui alt element

În cele din urmă, înregistrarea pentru 7 cuprinde funcția principală (), un program care determină funcția process_directory () pentru fiecare argument conținut în linia de comandă. În cererea de afaceri ar trebui să fie, de asemenea, prevăzută pentru retragerea unui mesaj de serviciu în cazul în care utilizatorul nu precizează cel puțin un argument, dar voi lăsa acest aspect pentru cititor ca un exercițiu.

Listarea 7. Funcția principală

În această lucrare este terminată. În ciuda numărului mare de fișiere atașate, procesarea intrările de director nu este foarte dificil.

concluzie