Structura fișierului pe disc. Fișiere și structuri de fișiere

Un fișier este informații care sunt stocate pe un mediu de stocare al computerului sub un anumit nume.

Fișierele pot stoca programe, texte și date.

Fișierele sunt identificate (identificate unic) prin nume. Utilizatorii dau fișierelor nume simbolice. În unele sisteme de operare, cum ar fi sistemul de operare Microsoft, fiecare nume de fișier constă direct din nume de fișier dat de utilizator și extensii. Acest lucru ia în considerare restricțiile sistemului de operare atât pentru caracterele utilizate în nume, cât și pentru lungimea numelui. Până de curând, aceste granițe erau foarte înguste. De exemplu, sistemul de fișiere al sistemului de operare MS-DOS a limitat lungimea numelui la schema 8.3 (au fost alocate 8 caractere pentru nume, 3 pentru extensie). Sistemele de fișiere moderne acceptă de obicei nume de fișiere simbolice lungi. Sistemele de operare Windows permit nume de până la 255 de caractere. Extensia este separată de numele fișierului prin simbolul „.” (punct).

Extensia arată tipul fișierului:

exe, com fișiere executabile, de ex. programe scrise într-unul dintre limbajele de programare;

doc - fișiere create în editorul de text Word;

xls - fișiere create în foaia de calcul Excel;

mdb – Accesați fișierele sistemului de management al bazelor de date (DBMS).

De obicei, pentru ușurință în utilizare, fișierele sunt combinate în directoare (foldere).

Pentru ca sistemul de operare să poată accesa fișierele, trebuie să specificați numele complet al fișierului, constând din numele dispozitivului extern (de obicei un disc), o secvență de subfoldere și un nume de fișier. De exemplu,

C:\Utilizator\Scrisoare.doc numele complet al fișierului Scrisoarea.doc situat pe unitatea C: în folder Utilizator. este numită secvența numelui dispozitivului extern și a tuturor subdosarelor calea completă către fișier.

Uneori, atunci când efectuați anumite operațiuni (căutare, copiere, ștergere fișiere) puteți utiliza modele de nume de fișiere.

Un șablon este un nume generic pentru un grup de fișiere care conține caracterele: * sau?.

Simbol * înseamnă că în locul acestuia pot apărea orice caractere valide, începând de la poziția în care apare și până la sfârșitul numelui.

Simbol ? indică faptul că o anumită poziție poate conține orice caracter valid, dar numai un singur.

De exemplu,

probă *.doc reprezintă toate fișierele cu extensia .doc,

șablonul Letter?.doc denotă toate fișierele denumite Letter1.doc, Letter3.doc, LetterZ.doc, LetterA.doc etc.

Pentru a stoca fișiere pe discuri și pentru a oferi acces la acestea, sistemele de operare moderne de discuri creează sisteme de fișiere. Principiul organizării multor sisteme de fișiere este tabelar.

Concept Sistemul de fișiere are două sensuri. Acesta este numele, în primul rând, pentru un mod specific de organizare a fișierelor, directoarelor etc., și în al doilea rând, pentru un anumit set de fișiere, directoare etc., organizate conform acestei metode.

Datele despre locul unde pe disc este înregistrat un anumit fișier sunt stocate în zona de sistem a discului în mod special tabele de alocare a fișierelor.

Sisteme de fișiere Microsoft.

Versiunile timpurii ale sistemului de operare Windows de la Microsoft au folosit tabele de alocare a fișierelor GRAS (FAT – FișierAlocațiionMasa).

Ca urmare a formatării, pe disc se formează piste (cercuri concentrice), fiecare dintre ele conţinând un anumit număr de sectoare. Un sector este o secțiune a unei piste care stochează informația minimă care poate fi citită sau scrisă pe un disc.

Pentru a organiza accesul la fișierele înregistrate pe discuri magnetice, sistemul de operare creează o listă de sectoare alocate fiecărui fișier. De obicei, spațiul pe disc este alocat fișierelor în blocuri din mai multe sectoare, numite clustere 5 . Clusterul este cea mai mică unitate adresarea date (determinarea locației lor) pe disc.

FAT constă din celule care stochează numere de cluster, iar principala diferență între diferitele FAT este dimensiunea acestor celule, determinată de numărul de cifre binare (biți). Sistemul de operare Windows 95 folosește FAT16, în care sunt alocați 16 biți pentru adresa clusterului și, prin urmare, numărul de clustere este de 65.536 (2 16). În cazul în care un cluster este egal cu un sector (512 octeți), capacitatea maximă a discului va fi de 32 MB. Odată cu apariția discurilor de mare capacitate, clusterul a început să fie format din mai multe sectoare - 2, 4, 8 etc.

Aici apare problema risipei de spațiu pe disc. Faptul este că un cluster nu poate conține mai mult de un fișier. Apoi, un fișier de 1 KB va folosi un cluster de 8 KB și 16 KB, în funcție de dimensiunea discului. Windows 95 OSR2 a introdus formatul de tabelă de alocare a fișierelor FAT32 (32 de biți) și a crescut numărul de clustere la 232 = 4.294.967.296, permițând clustere de 4 KB.

Fiecare fișier este asociat cu numele complet al fișierului, data creării fișierului, atributele fișierului și lungimea fișierului.

Elementul FAT pentru descrierea fișierului include:

    octet de atribut;

    timpul de modificare;

    data modificarii;

    Nr. al primului cluster de la care începe înregistrarea fișierului;

    mărime fișier.

Când un fișier este scris pe disc, sistemul de operare scrie numărul primului cluster alocat fișierului în directorul în care este creat fișierul. Apoi, în elementul care reprezintă acest cluster în FAT, OS scrie numărul următorului cluster, fișierul selectat etc. Astfel, pornind căutarea unui fișier în director și urmărind pointerii din FAT, OS poate selecta clustere legate de fișier în ordinea corespunzătoare, cluster cu cluster. Acesta este motivul pentru care dacă tabelul FAT este distrus, fișierul nu poate fi restaurat. Tabelul FAT este stocat pe disc în două copii.

Sistemul de fișiere FAT16 este acceptat de toate sistemele de operare Microsoft, unele sisteme de operare Unix și sistemele de operare OS/2.

Windows NT Workstation, Windows 2000 Professional și Windows XP acceptă sistemul de fișiere NTFS.

Sistemul de fișiere NTFS este reprezentat ca un tabel MFT (Maestru Fişier Masa), având următoarea formă:

Lungimea maximă a tabelului este de 1500 de octeți.

Primele 16 înregistrări sunt înregistrări de service; ele stochează informații care descriu tabelul MFT în sine (analog cu zona sistemului FAT).

Începând cu a 17-a intrare, există descrieri ale fișierelor și folderelor:

    informații standard – data și ora creării fișierului, dimensiunea acestuia;

    nume de fișier – stocat în 2 versiuni: lung (până la 255 de caractere) și scurt (8 + 3), utilizat la utilizarea fișierului în MS DOS;

    descriptorul de securitate indică cine are ce drepturi asupra unui anumit fișier sau folder;

    date – datele fișierelor în sine sunt stocate. Dacă fișierul este scurt, atunci toate datele sunt în acest loc. Dacă fișierul este mare, atunci o parte din el este stocată într-un câmp al acestui tabel MFT, iar partea rămasă este stocată în orice altă zonă, iar această zonă este referită în MFT.

Sistemul de fișiere NTFS acceptă un nivel ridicat de securitate (fiecare fișier poate avea un descriptor de protecție pentru copiere, citire, scriere, modificare etc.) și pot fi setate drepturi diferite pentru diferite grupuri de utilizatori.

Sistem de operare

Sistemul de fișiere

Microsoft MS-DOS

Microsoft Windows 95

Microsoft Windows 95 OSR2

Microsoft Windows 98

Microsoft Windows NT

Microsoft Windows 2000

NTFS, FAT16, FAT32

Microsoft Windows XP

NTFS, FAT16, FAT32

Windows NT, Windows 2000 Professional și Windows XP acceptă sistemul de fișiere FAT atunci când rulează pe dischete. Hard disk-ul acceptă două sisteme de fișiere - FAT și NTFS.

Una dintre componentele sistemului de operare este sistemul de fișiere - principala stocare a informațiilor despre sistem și utilizator. Toate sistemele de operare moderne funcționează cu unul sau mai multe sisteme de fișiere, de exemplu, FAT (File Allocation Table), NTFS (NT File System), HPFS (High Performance File System), NFS (Network File System), AFS (Andrew File System) , Sistem de fișiere Internet.

Un sistem de fișiere este o parte a sistemului de operare, al cărui scop este de a oferi utilizatorului o interfață convenabilă atunci când lucrează cu date stocate în memoria externă și de a permite partajarea fișierelor între mai mulți utilizatori și procese.

Într-un sens larg, conceptul de „sistem de fișiere” include:

Colectarea tuturor fișierelor de pe disc;

Seturi de structuri de date utilizate pentru gestionarea fișierelor, cum ar fi directoare de fișiere, descriptori de fișiere, tabele de alocare a spațiului pe disc liber și folosit;

Un set de instrumente software de sistem care implementează gestionarea fișierelor, în special: crearea, distrugerea, citirea, scrierea, denumirea, căutarea și alte operațiuni asupra fișierelor.

Sistemul de fișiere este de obicei utilizat atât la încărcarea sistemului de operare după pornirea computerului, cât și în timpul funcționării. Sistemul de fișiere îndeplinește următoarele funcții principale:

Stabilește modalități posibile de organizare a fișierelor și a structurii fișierelor pe suport;

Implementează metode de accesare a conținutului fișierelor și oferă instrumente pentru lucrul cu fișierele și structura fișierelor. În acest caz, accesul la date poate fi organizat de sistemul de fișiere atât după nume, cât și după adresă (număr de sector, suprafață și traseu media);

Monitorizează spațiul liber pe mediile de stocare.

Când un program de aplicație accesează un fișier, nu are idee cum se află informațiile dintr-un anumit fișier și nici pe ce tip de suport fizic (CD, hard disk sau unitate de memorie flash) este înregistrată. Tot ce știe programul este numele fișierului, dimensiunea și atributele acestuia. Acesta primește aceste date de la driverul sistemului de fișiere. Este sistemul de fișiere care determină unde și cum va fi scris fișierul pe suport fizic (de exemplu, un hard disk).

Din punctul de vedere al sistemului de operare, întregul disc este un set de clustere (zone de memorie) cu dimensiunea de la 512 octeți sau mai mare. Driverele sistemului de fișiere organizează clustere în fișiere și directoare (care sunt de fapt fișiere care conțin o listă de fișiere din acel director). Acești drivere țin evidența clusterelor care sunt utilizate în prezent, care sunt gratuite și care sunt marcate ca defecte. Pentru a înțelege clar cum sunt stocate datele pe discuri și modul în care sistemul de operare oferă acces la acestea, este necesar să înțelegem, cel puțin în termeni generali, structura logică a discului.


3.1.5 Structura logică a discului

Pentru ca un computer să stocheze, să citească și să scrie informații, hard disk-ul trebuie mai întâi să fie partiționat. Partițiile sunt create pe acesta folosind programe adecvate - aceasta se numește „partiționarea hard diskului”. Fără această partiționare, nu va fi posibilă instalarea sistemului de operare pe hard disk (deși Windows XP și 2000 pot fi instalate pe un disc nepartiționat, ei fac singuri această partiționare în timpul procesului de instalare).

Hard disk-ul poate fi împărțit în mai multe partiții, fiecare dintre acestea fiind utilizată independent. Pentru ce e asta? Un disc poate conține mai multe sisteme de operare diferite situate pe partiții diferite. Structura internă a unei partiții alocate oricărui sistem de operare este complet determinată de acel sistem de operare.

În plus, există și alte motive pentru partiționarea unui disc, de exemplu:

Posibilitatea de a utiliza discuri cu o capacitate mai mare decât MS DOS
32 MB;

Dacă un disc este deteriorat, se pierde doar informațiile care se aflau pe acel disc;

Reorganizarea și descărcarea unui disc mic este mai ușoară și mai rapidă decât a unuia mare;

Fiecărui utilizator i se poate atribui propria unitate logică.

Operația de pregătire a unui disc pentru utilizare este numită formatare, sau initializare. Tot spațiul disponibil pe disc este împărțit în laturi, piste și sectoare, cu piese și laturi numerotate începând de la zero, iar sectoarele începând de la unu. Un set de piste situate la aceeași distanță de axa unui disc sau a unui pachet de discuri se numește cilindru. Astfel, adresa fizică a sectorului este determinată de următoarele coordonate: numărul pistei (cilindru - C), numărul laturii discului (capul - H), numărul sectorului - R, i.e. CHR.

Primul sector al hard disk-ului (C=0, H=0, R=1) conține înregistrarea de pornire principală Master Boot Record. Această intrare nu ocupă întregul sector, ci doar partea inițială a acestuia. Master Boot Record este un program de încărcare de încărcare non-sistem.

La sfârșitul primului sector al hard diskului se află tabelul de partiții ale discului - Tabel de partiții. Acest tabel conține patru rânduri care descriu maximum patru partiții. Fiecare rând din tabel descrie o secțiune:

1) secțiune activă sau nu;

2) numărul sectorului corespunzător începutului de secțiune;

3) numărul sectorului corespunzător capătului de secțiune;

4) dimensiunea partiției pe sectoare;

5) codul sistemului de operare, adică cărui sistem de operare aparține această partiție?

O partiție este numită activă dacă conține programul de boot al sistemului de operare. Primul octet din elementul de secțiune este indicatorul de activitate al secțiunii (0 – inactiv, 128 (80H) – activ). Este folosit pentru a determina dacă partiția este de sistem (pornibilă) și pentru a forța sistemul de operare să pornească de la ea atunci când computerul pornește. O singură secțiune poate fi activă. Programele mici numite manageri de boot pot fi localizate în primele sectoare ale discului. Ei întreabă în mod interactiv utilizatorul de pe ce partiție să pornească și ajustează indicatoarele de activitate ale partiției în consecință. Deoarece tabelul de partiții are patru rânduri, pe disc pot exista până la patru sisteme de operare diferite, prin urmare, discul poate conține mai multe partiții primare aparținând unor sisteme de operare diferite.

Un exemplu de structură logică a unui hard disk format din trei partiții, dintre care două aparțin DOS și una aparține UNIX, este prezentat în Figura 3.2a.

Fiecare partiție activă are propria înregistrare de pornire - un program care încarcă un anumit sistem de operare.

În practică, discul este cel mai adesea împărțit în două partiții. Dimensiunile partițiilor, indiferent dacă sunt declarate active sau nu, sunt stabilite de utilizator în timpul procesului de pregătire a hard disk-ului pentru utilizare. Acest lucru se face folosind programe speciale. În DOS acest program se numește FDISK, în versiunile Windows-XX se numește Diskadministrator.

În DOS, partiția primară este Partiție primară, aceasta este secțiunea care conține bootloader-ul sistemului de operare și sistemul de operare în sine. Astfel, partiția primară este partiția activă, folosită ca unitate logică numită C:.

Sistemul de operare WINDOWS (și anume WINDOWS 2000) a schimbat terminologia: partiția activă se numește partiția de sistem, iar partiția de boot este discul logic care conține fișierele de sistem WINDOWS. Unitatea logică de pornire poate fi aceeași cu partiția de sistem, dar poate fi localizată pe o partiție diferită a aceluiași hard disk sau pe un alt hard disk.

Secțiunea avansată Partiție extinsă poate fi împărțit în mai multe unități logice cu nume de la D: la Z:.

Figura 3.2b prezintă structura logică a unui hard disk, care are doar două partiții și patru unități logice.

Lucrare de laborator nr 10

IEȘIRE PE DISC ȘI IMPRIMANTĂ

Afișarea simplă a informațiilor pe afișaj este folosită în aproape fiecare program, dar capacitățile sale sunt oarecum limitate. Chiar și utilizarea unei pauze temporare pentru a permite utilizatorului să citească toate mesajele nu rezolvă complet problema: odată ce un mesaj părăsește ecranul, acesta nu mai poate fi citit fără a porni din nou programul.

Mai mult, valorile atribuite variabilelor sunt reținute doar pe durata execuției programului. Odată ce programul este finalizat, toate informațiile introduse se pierd. Aceasta înseamnă că, dacă, de exemplu, ați introdus informații despre colecția dvs. de CD-uri într-o serie de variabile de structură, acestea se pierd la ieșirea programului, iar data viitoare când accesați computerul, va trebui să introduceți din nou toate datele.

Pentru a salva informații pentru dvs. sau pentru a familiariza alte persoane cu rezultatele programului dvs., trebuie să imprimați aceste rezultate pe hârtie. Și pentru a putea accesa oricând datele odată introduse, este necesar să salvați informațiile într-un fișier pe disc.

Ce este o structură de fișiere

Datele de ieșire nu sunt trimise imediat pe disc sau pe dispozitivul de imprimare, în funcție de instrucțiunile de ieșire corespunzătoare. În schimb, ei merg mai întâi într-o zonă de memorie concepută pentru stocarea temporară a informațiilor numită tampon. Și numai când tamponul este plin, datele sunt trimise pe disc sau imprimantă (Fig. 1). Datele introduse de pe disc intră mai întâi într-un buffer, de unde pot fi afișate pe ecran sau atribuite ca valoare variabilă.

Pentru a trimite date sau a primi date dintr-un buffer, aveți nevoie de un fel de legătură între programul dvs. și sistemul de operare al computerului. Acest link este structura fișierului.

Când un program deschide un fișier pentru lucru, acesta creează astfel o structură specială în memorie. Această structură conține informații

Orez. 1. Datele sunt stocate într-un buffer pentru ceva timp

necesare pentru ca programul și computerul dvs. să scoată date într-un fișier și să le introducă dintr-un fișier, precum și să imprime informații pe o imprimantă.

De exemplu, structura conține adresa unui buffer de fișier, astfel încât computerul să știe unde să caute informațiile pe care doriți să le scoateți pe disc sau unde să puneți datele pe care doriți să le citiți de pe disc. În plus, această structură stochează informații despre numărul de caractere rămase în buffer, precum și poziția următorului caracter atât din și în buffer (Fig. 2).


Orez. 2. Structura fișierului stochează informațiile necesare pentru executarea normală a operațiunilor cu fișiere

Aproape toate compilatoarele C și C++ stochează informațiile necesare pentru a lucra cu fișierele în fișierul antet STDIO.H. Acest fișier conține definiții ale constantelor care sunt necesare pentru operațiunile cu fișiere. În plus, poate conține o descriere a structurii fișierului. Pentru a utiliza funcțiile de lucru cu fișiere, programul ar trebui să înceapă cu instrucțiuni

#include,

ceea ce va face disponibile constantele fișierelor și descrierile structurii fișierelor în timpul compilării și legăturii programului.

Când introduceți date de pe un fișier de disc, acestea sunt copiate în memoria computerului, informațiile rămase pe disc nu se modifică în timp ce programul rulează. Din acest motiv, programatorii apelează această intrare citind date din dosar. La ieșirea datelor pe disc, o copie a datelor stocate în memorie este plasată într-un fișier. Această procedură se numește înregistrare pe disc.

Indicator la fișier

Introducerea sau ieșirea informațiilor în fișiere este furnizată folosind un așa-numit indicator de fișier, care este un pointer către o structură de fișier din memorie. Când scrieți informații într-un fișier sau citiți dintr-un fișier, programul obține informațiile necesare din structură. Pointerul fișierului este definit după cum urmează:

FILE *file_pointer;

Numele structurii FILE spune programului că variabila care este definită este un pointer către o structură de fișiere. Asteriscul indică crearea unui pointer cu numele variabilei corespunzător.

Dacă intenționați să utilizați mai multe fișiere în același timp, aveți nevoie de indicatoare pentru fiecare dintre ele. De exemplu, dacă scrieți un program care copiază conținutul unui fișier în altul, aveți nevoie de doi pointeri către fișiere. De asemenea, sunt necesare două indicatoare dacă doriți să citiți informații de pe disc și să le imprimați pe o imprimantă:

FIȘIER *infile, *outfile;

Cum se deschide un fișier

Legătura dintre program și fișier se stabilește folosind funcția fopen(), a cărei sintaxă este prezentată în Fig. 3.

Această funcție atribuie adresa unei structuri unui pointer. Primul parametru al acestei funcții este numele fișierului, care trebuie specificat în funcție de


Orez. 3. Sintaxa funcției fopen().

anumite reguli. De exemplu, în sistemul de operare MS-DOS, un nume de fișier poate consta din maximum opt caractere, plus o extensie de nume de cel mult trei caractere (extensia nu este un element obligatoriu). Dacă doriți să transmiteți informațiile către un dispozitiv de imprimare, mai degrabă decât pe un fișier de disc, utilizați „PRN” ca nume de fișier între ghilimele. În acest caz, datele sunt transmise automat la imprimantă.

Al doilea parametru al funcției este modul de acces la fișier, adică un mesaj despre operațiunile pe care utilizatorul intenționează să efectueze cu fișierul. În C și C++, parametrul care determină modul de acces este, de asemenea, cuprins între ghilimele. Sunt posibile următoarele opțiuni:

R - Indică ceea ce va fi executat citind informații dintr-un fișier în memoria computerului. Dacă fișierul nu există deja pe disc, programul va raporta o eroare de rulare.w - Indică faptul că va fi executat înregistrare date pe disc sau scoate pe o imprimantă. Dacă fișierul nu există în acest moment, sistemul de operare îl va crea. Dacă fișierul există deja pe disc, toate informațiile scrise în prezent pe el vor fi distruse.a - Indică faptul că ar trebui adăuga informații de la sfârșitul fișierului. Dacă fișierul nu există, sistemul de operare îl va crea. Dacă există, noua ieșire va fi atașată la sfârșitul fișierului fără a distruge conținutul curent.

De exemplu, dacă doriți să creați un fișier numit CD.DAT pentru a stoca un catalog de colecții de CD-uri, veți folosi următoarele instrucțiuni:

FIȘIER *cdfile;cdfile = fopen("CD.DAT", "w");

Dacă programul dvs. trebuie să citească dintr-un fișier în loc să scrie în el, utilizați următoarea notație:

FIȘIER *cdfile;cdfile = fopen("CD.DAT", "r");

Rețineți că atât numele fișierului, cât și caracterul modului de acces sunt cuprinse între ghilimele duble. Acest lucru se datorează faptului că sunt transmise la fopen() ca șiruri de caractere. Numele fișierului poate fi introdus de la tastatură ca valoare a unei variabile șir, iar apoi numele acelei variabile poate fi folosit ca argument, fără ghilimele.

Dacă doriți să imprimați informații despre colecția dvs. pe o imprimantă, utilizați următoarea secvență de instrucțiuni:

FIȘIER *cdfile;cdfile = fopen("PRN", "w");

Vă rugăm să rețineți că transmiterea informațiilor către imprimantă este posibilă numai cu modul de acces „w”.

Cum funcționează C/C++ cu fișierele

C stochează informații despre poziția curentă de citire și scriere într-un fișier folosind un pointer special.

Când citiți informații dintr-un fișier, indicatorul specifică următoarele date care trebuie citite de pe disc. Când un fișier este deschis pentru prima dată folosind modul de acces „r”, indicatorul este plasat la primul caracter al fișierului. Când se efectuează o operație de citire, indicatorul se deplasează la următoarea bucată de date care trebuie citită. Mărimea pasului de mișcare depinde de cantitatea de informații care este citită la un moment dat (Fig. 4). Dacă este citit un singur caracter la un moment dat, indicatorul se va muta la următorul caracter dacă este citită o structură întreagă, indicatorul se va muta la următoarea structură; Odată ce toate informațiile au fost citite din fișier, indicatorul merge la un cod special numit caracter de sfârșit de fișier Prezența caracterului de sfârșit de fișier nu este de fapt deloc necesară. Încercarea de a continua citirea după ce ajungeți la sfârșitul fișierului va avea ca rezultat o eroare de rulare.

Dacă un fișier este deschis cu modul de acces „w”, indicatorul este plasat și la începutul fișierului, astfel încât primele date introduse vor fi plasate la începutul fișierului. La închiderea unui fișier, un caracter de sfârșit de fișier va fi adăugat după matricea de date introdusă. Dacă fișierul există deja în momentul în care este deschis utilizând modul de acces „w”, toate datele pe care le conține sunt suprascrise și informațiile noi introduse prin procedura de scriere sunt scrise „pe deasupra” acestuia. Orice date care ar putea să nu fie distruse sunt plasate după noul caracter de sfârșit de fișier, astfel încât să nu mai poată fi accesate data viitoare când datele sunt citite din fișier. Astfel, orice încercare de a scrie date într-un fișier existent folosind modul de acces „w” va avea ca rezultat distrugerea informațiilor stocate în prezent în acesta. Acest lucru se va întâmpla chiar dacă fișierul este pur și simplu deschis și închis fără a scrie date.

Dacă un fișier este deschis utilizând modul de acces „a”, indicatorul este plasat la caracterul de sfârșit al fișierului. Datele noi care sunt scrise într-un fișier sunt plasate după datele existente și apoi este adăugat un caracter de sfârșit de fișier.

Cum se închide un fișier

După ce ați terminat de scris sau de citit dintr-un fișier, trebuie să îl închideți, adică să întrerupeți conexiunea dintre fișier și program. Acest lucru se face folosind instrucțiunile

Fclose(file_pointer);

Prin închiderea fișierului, obținem o garanție că toate informațiile din buffer sunt de fapt scrise în fișier. Dacă execuția programului se termină înainte ca fișierul să fie închis, o parte din informațiile care nu au ajuns pe disc pot rămâne în buffer, drept urmare se vor pierde. În plus, caracterul de sfârșit al fișierului nu va fi scris corect, iar programul nu va putea accesa fișierul data viitoare.

De adăugat că închiderea unui fișier eliberează pointerul, după care poate fi folosit cu un alt fișier sau pentru a efectua alte operații asupra aceluiași fișier. De exemplu, să presupunem că doriți să creați un fișier, să scrieți date în el și apoi să verificați dacă informațiile sunt scrise corect. Pentru a face acest lucru, programul poate folosi structura prezentată în Listing1.

Listare 1. Utilizarea unui indicator de fișier în două operații.

FILE *cdfile;if((cdfile = fopen("CD.DAT", "w")) == NULL) ( puts("Nu se poate deschide fișierul"); exit(); )/* Instrucțiuni pentru scrierea în fișier ar trebui să meargă aici */fclose(cdfile);if((cdfile = fopen("CD.DAT", "r")) == NULL) (puts("Nu se poate deschide fișierul"); exit(); )/* În acest moment, ar trebui să citiți instrucțiunile din fișierul scris */fclose(cdfile);

Aici fișierul este mai întâi deschis folosind modul de acces „w”, apoi datele sunt scrise în el. A doua oară, fișierul este deschis folosind modul de acces „r”, care permite citirea și afișarea datelor pe ecran.

Unele compilatoare vă permit să vă asigurați că toate datele sunt scrise într-un fișier prin ștergerea tamponului folosind funcția

Această funcție vă permite să ștergeți memoria tampon fără a închide fișierul și să scrieți toate datele din acesta pe disc sau să le trimiteți la o imprimantă.

Funcții de intrare și ieșire

Există mai multe moduri de a transmite date către și de la un fișier, în funcție de funcția utilizată:

· scrierea caracter-cu-caracter a datelor într-un fișier sau scoaterea lor către o imprimantă folosind funcția putc() sau fputc();

· citirea caracter cu caracter a datelor dintr-un fișier folosind funcția getc() sau fgetc();

· scrierea datelor linie cu linie într-un fișier sau scoaterea lor către o imprimantă folosind funcția fputs();

· citirea linie cu linie a datelor dintr-un fișier folosind funcția fgets();

· ieșire formatată de caractere, șiruri de caractere sau numere pe disc sau pe o imprimantă folosind funcția fprintf();

· introducerea formatată a caracterelor, șirurilor de caractere sau numerelor dintr-un fișier folosind funcția fscanf();

· scrierea unei structuri întregi folosind funcția fwrite();

· citirea unei întregi structuri folosind funcția fread().

Lucrul cu simboluri

Transferul de date caracter cu caracter este cea mai simplă formă de operațiuni cu fișiere. Deși nu este una dintre metodele utilizate pe scară largă de manipulare a informațiilor în practică, ea ilustrează totuși bine principiile de bază ale lucrului cu fișiere. Programul de mai jos scrie datele într-un fișier caracter cu caracter și continuă până când este apăsată o tastă. introduce:

/*fputc.c*/#include main() ( FILE *fp; literă caracter; if((fp = fopen("MYFILE","w"))==NULL) (puts("Nu se poate deschide fișierul") ; exit(); do (litera=getchar(); fputc(litera, fp); ) while(litera != "\r");

Fișierul se deschide cu modul de acces „w”. Dacă un fișier numit MYFILE nu există atunci când programul rulează, acesta va fi creat. Bucla do folosește funcția getchar() pentru a introduce o secvență de caractere, care este apoi scrisă într-un fișier folosind funcția putc(). Sintaxa putc() este:

Putc(car_variable, file_pointer);

Funcția fputc() poate fi folosită și cu aceleași argumente.

Bucla rulează până când o tastă este apăsată introduce care introduce un cod de retur (\r), care închide fișierul.

Lucrul cu șiruri

În loc să lucrați cu caractere individuale, puteți citi și scrie linii întregi de text dintr-un fișier. Scrierea și citirea rând cu linie se fac folosind funcțiile fputs() și fgets().

Funcția fputs() are următoarea sintaxă:

Fputs(variabilă_șir, indicator_fișier);

Această funcție scrie date rând cu linie într-un fișier sau scoate la o imprimantă, dar nu adaugă un cod „newline”. Pentru ca fiecare linie să fie scrisă pe disc (sau imprimată pe o imprimantă) într-adevăr ca o linie separată, trebuie să introduceți manual codul „newline”. De exemplu, următorul program creează un fișier de nume:

/*fputc.c*/#include main() ( FILE *fp; car flag; char name; if((fp = fopen("MYFILE","w"))==NULL) ( puts("Nu se poate deschide fișier "); exit(); ) flag = "y"; while(flag != "n") (puts("Introduceți un nume"); gets(nume); fputs(nume, fp); fputs("\ n" ,fp); printf("Doriți să introduceți un alt nume?"); flag=getchar(); fclose(fp)

Bucla while continuă până când n este introdus la prompt. În această buclă, numele este introdus de la tastatură folosind funcția gets(), după care numele este scris pe disc folosind funcția fputs(). În continuare, codul de „linie nouă” este scris în fișier, iar în cele din urmă programul întreabă utilizatorul dacă dorește să continue introducerea numelor.

Dacă compilatorul dumneavoastră poate folosi funcția strlen(), puteți simplifica oarecum procedura de introducere folosind următoarele instrucțiuni:

Printf("Vă rugăm să introduceți un nume: ");gets(nume);while(strlen(nume) > 0) ( fputs(nume, fp); fputs("\n", fp); printf("Vă rugăm să introduceți un nume : "); primește (nume); )

Caracterele pe care le tastați pe tastatură sunt atribuite numelui variabilei șir și apoi verificate pentru a vedea dacă lungimea șirului este 0. Dacă apăsați Enter imediat când vi se solicită, șirul va avea o lungime de zero și bucla se va opri executarea . Dacă înainte de a apăsa introduce introduceți cel puțin un caracter, linia și codul „linia nouă” vor fi scrise pe disc.

Unele compilatoare vă permit să simplificați și mai mult algoritmul de introducere a șirurilor, de exemplu, astfel:

Printf("Vă rugăm să introduceți un nume: ");while(strlen(gets(name)) > 0) ( fputs(name, fp); fputs("\n", fp); printf("Vă rugăm să introduceți un nume: " ;

unde intrarea liniei se face în condiția while.

Pentru a imprima un șir pe o imprimantă, numele fișierului „prn” este folosit în loc să îl scrieți pe disc. Pentru a deschide un fișier trebuie să specificați:

Dacă ((fp = fopen ("prn", "w")) == NULL)

Pentru a crea un program de imprimare, lungimea liniei este setată la 81 de caractere, astfel încât linia să se potrivească pe toată lățimea ecranului înainte de a apăsa o tastă. introduce. Lista 2 este un program care demonstrează cum poate fi scris un simplu procesor de text. Linia nu este trimisă la imprimantă până când nu este apăsată o tastă introduce, care vă permite să utilizați cheia Backspace corectați erorile de introducere a liniilor.

Lista 2. Program pentru ieșirea unui șir către un dispozitiv de imprimare.

/*wp.c*/#include "stdio.h"main() ( FILE *fp; char line; if ((fp = fopen("prn", "w")) == NULL) ( puts("Imprimanta nu este gata de lucru"); exit(); ) puts("Introduceți text, apăsați Enter după fiecare rând\n"); puts("Pentru a opri tastarea, apăsați Enter la începutul unui nou rând\n"); gets (line) ; while (strlen(line) > 0) ( fputs(line, fp); fputs("\n", fp); gets(line); ) fclose(fp);

Rânduri de lectură

Citirea liniilor dintr-un fișier se face folosind funcția fgets(). Sintaxa funcției:

Fgets(variabilă_șir, lungime, indicator_fișier);

Funcția introduce întregul șir până la caracterul newline dacă lungimea acestuia nu depășește valoarea specificată în parametrul lungime minus un caracter. Parametrul lungime este un număr întreg, sau o constantă sau variabilă întreg, indicând numărul maxim posibil de caractere pe linie.

Mai jos este un program care citește numele din fișierul creat în exemplul anterior:

/*fgets.c"/#include "stdio.h"main() ( FIȘIER *fp; nume caracter; if ((fp = fopen("MYFILE", "r")) == NULL) ( puts("Impossible deschide fișierul"); exit(); ) while(fgets(nume, 12, fp) != NULL) ( printf(nume); ) fclose(fp); )

Intrarea este efectuată într-o buclă while până când valoarea caracterului citit este NULL. Odată ce pointerul ajunge la sfârșitul fișierului, variabilei șir i se atribuie valoarea NULL. Când citiți dintr-un fișier linie cu linie, NULL este întotdeauna folosit pentru a indica sfârșitul fișierului, iar EOF este folosit când citiți caracter cu caracter.

Dacă scrieți un program pentru a citi orice fișier text, specificați ca argumentul de lungime să fie 80.

Apropo, rețineți că funcția printf() este folosită în acest exemplu pentru a imprima conținutul unei variabile șir fără specificatori de format. Fiecare linie citită din fișier include codul newline care a fost scris în fișier în instrucțiunea fputs("\n", fp și nu trebuie să fie incluse coduri de newline suplimentare în parametrii funcției printf());

Lista 3. Ieșire formatată.

/*fprintf.c*/#include "stdio.h"main() ( FILE *fp; char name; int cantitate; float cost; if ((fp = fopen("MYFILE", "w")) == NULL ) ( puts("Nu se poate deschide fișierul"); exit(); ) printf("Introduceți numele produsului: "); ) ; scanf("%f", &costf("Introduceți numărul de unități: "); , cantitate; printf("Introduceți numele produsului: ");

Vă rugăm să rețineți că în ultima linie a buclei este introdus următorul nume. Acest lucru vă permite să opriți repetarea ciclului prin simpla apăsare a unei taste introduce. Unii programatori începători ar scrie probabil bucla astfel:

Do ( printf("Introduceți numele produsului: "); gets(nume); printf("Introduceți prețul: "); scanf("%f", &cost); printf("Introduceți numărul de unități de produs: ") ; scanf(" %d", &cantitate)(fp, "%s %d\n", nume, cost, cantitate) ;

și acest program ar funcționa la fel de bine, cu excepția faptului că ar necesita apăsarea unei taste pentru a încheia bucla introduce de trei ori: prima dată la introducerea numelui și încă de două ori ca răspuns la solicitarea de a introduce prețul și cantitatea produsului.

În interiorul buclei while, prețul și cantitatea fiecărui articol sunt introduse folosind funcția scanf() și apoi scrise pe disc folosind instrucțiunea

Fprintf(fp, „%s %f %d\n”, nume, cost, cantitate);

Rețineți că codul de linie nouă este scris în fișier la sfârșitul fiecărei linii. Dacă vizualizați conținutul fișierului folosind comanda TYPE a sistemului de operare MS-DOS, atunci fiecare linie a listei de inventar și pe ecran va începe pe o linie nouă:

Dacă codul newline nu ar fi fost scris pe disc, textul ar fi fost tipărit consecutiv, pe o singură linie de pe ecran și ar fi arătat cam așa:

Dischete 1,120000 100bandă 7,340000 150cartuș 75,000000 3

Vă rugăm să rețineți că nu există spațiu între numărul care arată numărul de unități ale unui produs și numele următorului. Chiar și cu această metodă de înregistrare, puteți citi cu ușurință din acest fișier, deoarece compilatorul este capabil să distingă între sfârșitul unei valori numerice și începutul unei linii, dar ce se întâmplă dacă ultima valoare pentru fiecare nume de produs este o linie cu numele producatorului? Informațiile din fișier vor arăta cam așa:

Dischete 1,120000 Bandă Memoryex 7,340000 Cartuș Okaydata 75,000000 CP

iar apoi, la citirea datelor dintr-un fișier, programul va atașa începutul datelor despre următorul produs la sfârșitul descrierii celui precedent. De exemplu, datele despre primul nume de produs ar arăta astfel:

Dischete 1.120000 bandă Memoryex

Toate datele scrise pe disc, chiar și valorile int sau float, sunt stocate ca caractere text. Vom vorbi despre asta puțin mai târziu.

Lista 4. Citirea textului îmbogățit dintr-un fișier.

/*fscanf.c*/#include "stdio.h"main() ( FILE *fp; char name; int cantitate; float cost; if ((fp = fopen("MYFILE", "r")) == NULL ) (puts("Nu se poate deschide fișierul"); exit(); ) while (fscanf(fp, "%s%f%d", nume, &cost, &cantitate) != EOF) ( printf("Nume produs: % s \n”, nume); printf(„Preț: %.2f\n”, cost); printf(„Număr de unități: %d\n”, cantitate); ) fclose(fp); )

Lucrul cu structurile

O modalitate de a depăși limitările scanf() este de a combina elementele de date într-o structură, astfel încât structurile întregi să poată fi introduse și scoase mai târziu. Structura poate fi scrisă pe disc folosind funcția fwrite() și citită dintr-un fișier folosind funcția fread().

Sintaxa funcției fwrite() este:

Fwrite(&structure_variable, structure_size, number_of_structures, file_pointer);

La prima vedere, această instrucțiune pare puțin intimidantă, dar de fapt este foarte ușor de utilizat:

· &structure_variable - numele unei variabile de structură cu un operator de recepție a adresei care spune compilatorului adresa de pornire a informațiilor pe care dorim să le scriem pe disc;

· structure_size este numărul de caractere din structură; Nu trebuie să îl calculați singur, puteți utiliza funcția de bibliotecă sizeof(), scrisă astfel:

Sizeof(structure_variable)

care va determina automat dimensiunea structurii specificate;

· number_of_structures este un număr întreg care determină numărul de structuri pe care dorim să le scriem la un moment dat; Numărul 1 ar trebui să fie întotdeauna specificat aici, cu excepția cazului în care urmează să creați o matrice de structuri și să o scrieți într-un bloc mare;

· file_pointer - indicator către fișier.

De exemplu, să presupunem că doriți să inscripționați informații despre colecția de CD-uri pe disc. Folosind structura CD-ului, despre care am discutat în detaliu mai devreme, scriem instrucțiunea: fwrite(&disc, sizeof(disc), 1, fp);

Execuția acestei instrucțiuni este ilustrată în Fig. 5.

Programul care introduce date într-o structură de CD și apoi le salvează pe disc este prezentat în Lista 12.5. Funcția gets() este folosită pentru a introduce numele fișierului de creat. Variabila care stochează numele fișierului este folosită de funcția fopen() pentru a deschide fișierul.

Informațiile despre fiecare structură de CD sunt introduse de la tastatură, după care întreaga structură este scrisă pe disc.



Orez. 5. Sintaxa funcției fwrite() din instrucțiunea de scriere a structurii CD-ului

Lista 5. Înregistrarea structurii CD-ului.

/*fwrite.c*/#include "stdio.h"main() ( FILE *fp; struct CD (nume char; descriere caracter; categorie char; cost float; număr int; ) disc; nume fişier char; printf("Enter numele fișierului pe care doriți să-l creați: "); gets(nume fișier); if ((fp = fopen(nume fișier, "w")) == NULL) ( printf("Nu se poate deschide fișierul %s\n", filename); exit(); puts("Introduceți informații despre disc\n"); gets(disc.description); printf("Introduceți categoria: "); number: "); scanf("%d", &disc.number); fwrite(&disc, sizeof(disc), 1, fp); printf("Introduceți numele: "); ; ) fclose(fp);

Structuri de lectură

Fread(&structure_variable, structure_size, number_of_structures, file_pointer);

Cu excepția numelui funcției, această instrucțiune este exact aceeași cu funcția fwrite(). Programul care citește structura CD-ului dintr-un fișier este afișat în Lista 6. Pentru a citi datele, utilizați o buclă while:

În timp ce (fread(&disc, dimensiunea(disc), 1, fp) == 1)

Funcția fread() returnează o valoare corespunzătoare numărului de structuri citite cu succes. Deoarece am specificat în argumentul funcției că ar trebui să citim câte o structură la un moment dat, funcția returnează valoarea 1. Bucla while va fi executată atâta timp cât citirea structurilor de pe disc are succes. Dacă structura nu poate fi citită, de exemplu pentru că s-a ajuns la sfârșitul fișierului, funcția returnează 0 și bucla se termină.

Listarea 6. Citirea structurii CD-ului de pe disc.

/*fread.c*/#include "stdio.h"main() ( FILE *fp; struct CD (nume char; descriere caracter; categorie char; cost float; număr int; ) disc; nume fişier char; printf("Enter numele fișierului pe care doriți să-l deschideți: "); gets(nume fișier); if ((fp = fopen(nume fișier, "r")) == NULL) ( printf("Nu se poate deschide fișierul %s\n", nume fișier ); exit (); while (fread(&disc, sizeof(disc), 1, fp) == 1) ( puts(disc.name); putchar("\n"); puts(disc.description); putchar ("\ n"); puts(disc.category); printf("%f", putchar("%d", disc.); .număr) ; fclose(fp);

În tabel 1 colectează toate metodele descrise de introducere și ieșire a datelor și arată valorile pe care fiecare funcție le returnează dacă este imposibil să continui citirea sau scrierea datelor.

Tabelul 1. Funcții pentru intrarea și ieșirea dintr-un fișier.

Citirea într-o matrice

Toate exemplele de programe prezentate până acum au citit date dintr-un fișier și au afișat intrarea pe ecran. Cu toate acestea, dacă citiți date în variabile, puteți efectua orice operație asupra acestora, de exemplu, să le folosiți pentru a scrie într-o matrice.

Lista 7 arată textul unui program care citește informații dintr-un fișier care conține date despre o colecție de CD-uri într-o serie de structuri CD (presupunând că nu mai mult de 20 dintre ele). Indexul este utilizat pentru a se asigura că fiecare structură citită dintr-un fișier este stocată într-un element separat al matricei de discuri. După ce următoarea structură este citită și afișată, costul următorului disc este adăugat la suma care reflectă costul total al colecției, iar indexul și contorul sunt incrementate prin executarea următoarelor instrucțiuni:

Total = total + disc.cost;index++;count++;

Dacă am fi interesați doar de informații despre costul total și numărul de instanțe ale colecției, am putea citi datele într-o variabilă de structură fără a folosi o matrice și pur și simplu să numărăm valorile variabilelor totale și numărătoare. Cu toate acestea, dacă datele sunt citite într-o matrice, puteți accesa în mod arbitrar structurile și puteți imprima orice informație.

Rețineți că programul repetă solicitarea pentru un nume de fișier până când introduceți un nume de fișier care poate fi de fapt deschis.

Lista 7. Citirea unei structuri într-o matrice.

/*rarray.c*/#include "stdio.h"main() ( FILE *fp; struct CD (nume char; descriere caracter; categorie char; cost float; număr int; ) disc; index int, număr; total float ; count = 0; total = 0 printf("Introduceți numele fișierului de date: "; ", nume fișier); printf("Introduceți numele fișierului de date: "); gets(nume fișier); ) index = 0; while (fread(&disc, sizeof(disc), 1, fp) == 1) ( puts(disc. nume; putchar("\n"); putchar("\n"); cost); printf("%d", total = total + cost.fp; colecția conține %.d discuri\n", count )

Lista 8. Program pentru copierea conținutului fișierului.

/*filecopy.c*/#include "stdio.h"main() ( FILE *fp1, *fp2; char infile, outfile; int letter; printf("Introduceți numele fișierului pentru a citi: "); gets(infile); if ((fp1 = fopen(infile, "r")) == NULL) ( printf("Nu se poate deschide fișierul %s", infile); exit(); ) printf("Introduceți numele fișierului de scris: ") ; (outfile); if ((fp2 = fopen(infile, "w")) == NULL) ( printf("Nu se poate deschide fișierul %s", outfile); fclose(fp1); exit(); ) (litera = fgetc(fp1)) != EOF) ( putchar(litera); fputc(litera, fp2); ) fclose(fp1);

Primul fișier este deschis cu modul de acces „r”, astfel încât datele să poată fi citite din el. Dacă fișierul nu poate fi deschis, programul se termină. Al doilea fișier se deschide cu modul de acces „w”, care vă permite să scrieți


Orez. 6. Funcția fprintf() scrie valori numerice ca caractere text

el datele. Dacă al doilea fișier nu poate fi deschis, primul fișier este închis mai întâi înainte de ieșirea programului. Acest lucru ne oferă garanția că primul fișier, dacă a fost deschis cu succes, nu va fi deteriorat la ieșirea programului.

Funcția fprintf() scrie toate datele ca text. De exemplu, dacă utilizați fprintf() pentru a scrie numărul 34.23 pe disc, cinci caractere vor fi scrise așa cum se arată în Fig. 6. Dacă funcția fscanf() este utilizată ulterior pentru a citi date dintr-un fișier, caracterele vor fi convertite într-o valoare numerică și scrise într-o variabilă în această formă.

Deoarece funcția fprintf() scrie datele ca text, citirea dintr-un fișier se poate face și folosind funcțiile getc(), fgetc() sau fgets(). Cu toate acestea, aceste funcții vor citi informațiile sub formă de caractere „printabile”. De exemplu, dacă utilizați funcția fgets(), numerele vor fi citite ca caractere care fac parte dintr-un șir. Când afișați sau imprimați date citite folosind fgets() sau fgetc(), nu veți putea efectua operații aritmetice pe elemente de date individuale.

Format binar

Funcția fwrite() este utilizată pentru a salva variabile numerice în format binar. Datele scrise în acest fel vor ocupa aceeași cantitate de spațiu pe disc ca și în memorie. Dacă vedem conținutul unui astfel de fișier folosind comanda TYPE, vom vedea litere și pictograme fără sens în locul valorilor numerice. Acestea sunt caractere ASCII echivalente cu valorile scrise în fișier.

Pentru a citi un fișier scris cu fwrite(), ar trebui să utilizați funcția fread(). Datele trebuie introduse într-o structură care are o structură corespunzătoare datelor salvate anterior. Structura poate avea un nume diferit, iar numele membrilor structurii pot diferi, dar ordinea, tipurile și dimensiunile membrilor ambelor structuri trebuie să fie aceleași.

Tipărirea datelor

Din punct de vedere tehnic, puteți scoate date către o imprimantă folosind orice funcție de ieșire: caracter cu caracter, rând cu linie, șiruri sau structuri formatate. Singurul lucru necesar este să specificați numele fișierului „prn” și modul de acces „w”.

Cu toate acestea, imprimarea „structurală” folosind funcția fwrite() nu este practic utilizată, deoarece datele numerice vor fi tipărite în format binar ca caractere criptice. În schimb, funcția fprintf() este folosită pentru a tipări structuri, așa cum se arată în Lista 9. Acest program deschide două fișiere: fișierul disc este deschis pentru citire și fișierul imprimantei este deschis pentru ieșire.

Listarea 9. Citirea și tipărirea conținutului unui fișier pe disc.

Fiecare structură este introdusă ca un întreg de către funcția fread(), după care membrii individuali ai structurii sunt imprimați folosind funcția fprintf(). Funcția fread() poate citi șiruri de caractere care includ spații, deci este de preferat să folosiți funcția fscanf().

Instrucțiuni

Fprintf(ptr, "\n\n");

scoateți două linii goale între structurile CD individuale.

Proiectarea programului

Știind cum să scrieți și să citiți de pe un fișier disc deschide posibilitatea de a crea aplicații complexe. Toate programele care au demonstrat introducerea datelor de pe un fișier pe disc citesc întregul fișier. Dar vă puteți imagina o situație în care doriți să tratați datele într-un alt mod.

De exemplu, poate fi necesar să scanați un fișier de disc pentru o anumită intrare. În acest caz, ar trebui să deschideți fișierul cu modul de acces „r”, apoi să utilizați o buclă pentru a introduce treptat date, structură cu structură sau linie cu linie, în funcție de tipul de informații scrise în fișier. În timpul fiecărei iterații a buclei, valorile datelor de intrare sunt comparate cu valorile căutate. Pentru a verifica valorile șirurilor de caractere, utilizați funcția strcmp(), dacă compilatorul dvs. o permite, desigur. Odată găsite datele necesare, acestea sunt afișate pe ecran, după care fișierul este închis.

Clasificarea, structura, caracteristicile sistemelor de fisiere!!!

1. Conceptul, structura și funcționarea sistemului de fișiere.

Un sistem de fișiere este un set (ordine, structură și conținut) de organizare a stocării datelor pe medii de stocare, care oferă direct acces la datele stocate la nivel de zi cu zi, este un set de toate fișierele și folderele de pe un disc; Principalele „unități” ale unui sistem de fișiere sunt considerate a fi un cluster, un fișier, un director, o partiție, un volum și un disc.
O colecție de zerouri și unu pe un mediu de stocare alcătuiește un cluster (dimensiunea minimă a spațiului pentru stocarea informațiilor, ele sunt de obicei numite și conceptul de sector, dimensiunea lor este un multiplu de 512 octeți).
Fișiere - o colecție numită de octeți împărțiți în sectoare. În funcție de sistemul de fișiere, un fișier poate avea un set diferit de proprietăți. Pentru comoditate în lucrul cu fișierele, sunt folosite numele acestora (identificatori simbolici).
Pentru a organiza structura sistemului de fișiere, fișierele sunt grupate în cataloage .
Capitol - o zonă a unui disc creată la partiționarea acestuia și care conține unul sau mai multe volume formatate.
Volum - zonă de partiție cu sistem de fișiere, tabel de fișiere și zonă de date. Una sau mai multe secțiuni alcătuiesc disc .
Toate informațiile despre fișiere sunt stocate într-o zonă specială a partiției - tabelul de fișiere. Tabelul de fișiere vă permite să asociați identificatori numerici de fișiere și informații suplimentare despre acestea (data modificată, drepturi de acces, nume etc.) cu conținutul real al fișierului stocat într-o altă zonă de partiție.

MBR (Master Boot Record) o zonă specială situată la începutul discului - care conține informațiile necesare pentru ca BIOS-ul să pornească sistemul de operare de pe hard disk.
Tabelul de partiții este, de asemenea, situat la începutul discului, sarcina sa este de a stoca informații despre partiții: început, lungime, încărcare. Partiția de pornire conține sectorul de boot, care stochează programul de boot al sistemului de operare.

Numărătoarea inversă începe de la MBR (din sectorul numărul 0) pentru toate partițiile primare, atât obișnuite, cât și extinse, și numai pentru cele primare.
Toate secțiunile logice obișnuite (nu logice extinse) sunt specificate printr-un decalaj relativ la începutul secțiunii extinse în care sunt descrise.
Toate partițiile logice extinse sunt specificate printr-un decalaj relativ la începutul partiției primare extinse.

Procesul de pornire a sistemului de operare este următorul:
Când porniți computerul, BIOS-ul preia controlul asupra procesorului, pornește de pe hard disk, încarcă primul sector al discului (MBR) în memoria RAM a computerului și îi transferă controlul).

MBR-ul poate fi scris ca un bootloader „standard”,

și bootloadere precum LILO/GRUB.

Încărcătorul de pornire standard găsește prima partiție cu indicatorul de pornire în tabelul principal de partiții, citește primul ei sector (sector de pornire) și transferă controlul către codul scris în acest sector de pornire. Dacă în loc de încărcătorul standard MBR există altul, atunci acesta nu se uită la steag-ul de pornire și poate porni de pe orice partiție (prescris în setările sale).

De exemplu, pentru a încărca sistemul de operare Windows NT/2k/XP/2003, codul este scris în sectorul de pornire care încarcă încărcătorul principal (ntloader) din partiția curentă în memorie.
Fiecare sistem de fișiere FAT16/FAT32/NTFS utilizează propriul său bootloader. Rădăcina partiției trebuie să conțină fișierul ntldr. Dacă vedeți mesajul „NTLDR is missing” când încercați să porniți Windows, atunci acesta este exact cazul când fișierul ntldr lipsește. De asemenea, pentru funcționarea normală a ntldr, este posibil să aveți nevoie de fișierele bootfont.bin, ntbootdd.sys, ntdetect.com și de un boot.ini scris corect.

Exemplu boot.ini

C:\boot.ini

timeout=8
implicit=C:\gentoo.bin

C:\gentoo.bin="Gentoo Linux"
multi(0)disk(0)rdisk(0)partiție(1)\WINDOWS="Windows XP (32-bit)" /fastdetect /NoExecute=OptIn
multi(0)disc(0)rdisk(0)partiție(3)\WINDOWS="Windows XP (64-bit)" /fastdetect /usepmtimer

Exemplu de fișier de configurare grub.conf

#grub.conf generat de anaconda
#
#Rețineți că nu trebuie să rulați din nou grub după ce faceți modificări la acest fișier
#
#OBSERVAȚIE: aveți o partiție /boot. Aceasta înseamnă că
#toate căile nucleului și initrd sunt relative la /boot/, de ex.
#rădăcină (hdO.O)
#kernel /vmlinuz-version ro root=/dev/sda2
#initrd/initrd-version.img
#boot=/dev/sda default=0 timeout=5
splashimage=(hdO,0)/grub/splash.xpm.gz
meniu ascuns
titlu Server Red Hat Enterprise Linux (2.6.18-53.el 5)
rădăcină (hdO.O)
kernel /vmlinuz-2.6.18-53.el5 ro root=LABEL=/ rhgb quiet-
initrd /initrd-2.6.18-53.el5.img

Structura fișierului lilo.conf

# Fișierul de configurare LILO generat de „liloconfig”
//Secțiune pentru descrierea parametrilor globali
# Porniți secțiunea globală LILO
//Locația în care este înregistrată Lilo. În acest caz este vorba de MBR
boot = /dev/hda
//Mesaj care este afișat la încărcare
mesaj = /boot/boot_message.txt
//Afișează o invitație
prompt
//Time Out pentru a selecta sistemul de operare
timeout = 1200
# Ignorați valorile implicite periculoase care rescriu tabelul de partiții:
reguli de schimbare
resetare
Consolă framebuffer #VESA @ 800x600x256
//Se selectează modul video pentru afișarea meniului
vga = 771
# Încheiați secțiunea globală LILO
//Secțiune pentru descrierea parametrilor de boot Windows
# Începe configurarea partiției bootabile DOS
altele = /dev/hda1
etichetă = Windows98
tabel = /dev/hda
# Configurația partiției bootabile DOS se termină
//Secțiune pentru descrierea parametrilor de boot QNX
# Începe configurația partiției bootabile QNX
//Cale către sistemul de operare
altele = /dev/hda2
etichetă = QNX
tabel = /dev/hda
# Configurația partiției bootabile QNX se încheie
//Secțiune pentru descrierea parametrilor de boot Linux
# Începe configurarea partiției bootabile Linux
//Cale către imaginea kernelului
imagine = /boot/vmlinuz
root = /dev/hda4
label = Slackware
numai pentru citire
# Configurația partiției bootabile Linux se încheie


2. Cele mai cunoscute sisteme de fișiere.

  • Sistem avansat de arhivare pe disc
  • AdvFS
  • Fii sistem de fișiere
  • CSI - DOS
  • Criptarea sistemului de fișiere
  • Sistem de fișiere extins
  • Al doilea sistem de fișiere extins
  • Al treilea sistem de fișiere extins
  • Al patrulea sistem de fișiere extins
  • Tabelul de alocare a fișierelor (FAT)
  • Fișiere - 11
  • Sistem ierarhic de fișiere
  • HFS Plus
  • Sistem de fișiere de înaltă performanță (HPFS)
  • ISO 9660
  • Sistem de fișiere jurnalizate
  • Sistemul de fișiere Macintosh
  • Sistem de fișiere MINIX
  • MicroDOS
  • Următorul3
  • Noua implementare a unui F structurat în jurnal (NILFS)
  • Servicii de stocare Novell
  • Sistem de fișiere cu tehnologie nouă (NTFS)
  • Protogon
  • ReiserFS
  • Sistem de fișiere inteligent
  • Squashfs
  • Sistemul de fișiere Unix
  • Format universal de disc (UDF)
  • Sistemul de fișiere Veritas
  • Windows Future Storage (WinFS)
  • Scrieți oriunde aspectul fișierului
  • Sistemul de fișiere Zettabyte (ZFS)

3. Principalele caracteristici ale sistemelor de fișiere.

Sistemul de operare oferă aplicațiilor un set de funcții și structuri pentru lucrul cu fișierele. Capacitățile sistemului de operare impun restricții suplimentare asupra limitărilor sistemului de fișiere, principalele restricții includ:

Dimensiunea maximă (minimă) a volumului;
- Numărul maxim (minim) de fișiere în directorul rădăcină;
- Numărul maxim de fișiere într-un director non-rădăcină;
- Securitate la nivel de fișier;
- Suport pentru nume lungi de fișiere;
- Auto vindecare;
- Compresie la nivel de fișier;
- Mentinerea jurnalelor de tranzactii;

4. Scurtă descriere a celor mai comune sisteme de fișiere FAT, NTFS, EXT.

Sistemul de fișiere FAT.

FAT (tabelul de alocare a fișierelor) înseamnă tabelul de alocare a fișierelor.
În sistemul de fișiere FAT, spațiul de disc logic al oricărei unități logice este împărțit în două zone:
- zona de sistem;
- zona de date.
Zona de sistem este creată în timpul formatării și actualizată atunci când structura fișierului este manipulată. Zona de date conține fișiere și directoare subordonate rădăcinii și este accesibilă prin interfața cu utilizatorul. Zona de sistem este formată din următoarele componente:
- înregistrarea de pornire;
- sectoare rezervate;
- tabele de alocare a fișierelor (FAT);
- directorul rădăcină.
Tabelul de alocare a fișierelor este o hartă (imagine) a zonei de date, care descrie starea fiecărei secțiuni a zonei de date. Zona de date este împărțită în clustere. Un cluster este unul sau mai multe sectoare învecinate într-un spațiu de adrese de disc logic (numai zona de date). În tabelul FAT, clusterele aparținând aceluiași fișier (director non-rădăcină) sunt legate în lanțuri. Sistemul de gestionare a fișierelor FAT16 utilizează un cuvânt de 16 biți pentru a indica numărul clusterului, astfel încât să puteți avea până la 65.536 clustere.
Un cluster este unitatea minimă adresabilă de memorie de disc alocată unui fișier sau director non-rădăcină. Un fișier sau un director ocupă un număr întreg de clustere. În acest caz, ultimul cluster poate să nu fie utilizat pe deplin, ceea ce va duce la o pierdere vizibilă a spațiului pe disc dacă dimensiunea clusterului este mare.
Deoarece FAT este folosit foarte intens la accesarea discului, este încărcat în RAM și rămâne acolo cât mai mult timp posibil.
Directorul rădăcină diferă de un director obișnuit prin faptul că este situat într-o locație fixă ​​pe un disc logic și are un număr fix de elemente. Pentru fiecare fișier și director, sistemul de fișiere stochează informații conform următoarei structuri:
- nume de fișier sau director – 11 octeți;
- atribute fișier – 1 octet;
- câmp de rezervă – 1 octet;
- timp de creare – 3 octeți;
- data creării – 2 octeți;
- data ultimului acces – 2 bytes;
- rezervat – 2 octeți;
- timpul ultimei modificări – 2 octeți;
- numărul inițial al clusterului în FAT – 2 octeți;
- dimensiunea fișierului – 4 octeți.
Structura sistemului de fișiere este ierarhică.

Sistem de fișiere FAT32.
FAT32 este un sistem de fișiere complet independent pe 32 de biți și conține numeroase îmbunătățiri și completări față de FAT16. Diferența fundamentală dintre FAT32 este utilizarea mai eficientă a spațiului pe disc: FAT32 utilizează clustere mai mici, ceea ce duce la economii de spațiu pe disc.
FAT32 poate muta directorul rădăcină și poate folosi backup-ul FAT în locul celui standard. FAT32 Enhanced Boot Record vă permite să creați copii ale structurilor de date critice, făcând unitățile mai rezistente la încălcările structurii FAT decât versiunile anterioare. Directorul rădăcină este un lanț obișnuit de clustere, deci poate fi localizat în orice locație de pe disc, ceea ce elimină limitarea dimensiunii directorului rădăcină.


Sistem de fișiere NTFS.
Sistemul de fișiere NTFS (New Technology File System) conține o serie de îmbunătățiri și modificări semnificative care îl deosebesc semnificativ de alte sisteme de fișiere. Din punctul de vedere al utilizatorilor, fișierele sunt încă stocate în directoare, dar lucrul pe discuri mari în NTFS este mult mai eficient:
- există mijloace de restricționare a accesului la fișiere și directoare;
- au fost introduse mecanisme care cresc semnificativ fiabilitatea sistemului de fișiere;
- multe restricții privind numărul maxim de sectoare de disc și/sau clustere au fost eliminate.

Principalele caracteristici ale sistemului de fișiere NTFS:
- fiabilitate. Calculatoarele performante si sistemele partajate trebuie sa aiba fiabilitate sporita in acest scop, a fost introdus un mecanism de tranzactie in care se inregistreaza tranzactiile cu fisiere;
- funcționalitate extinsă. Au fost introduse noi caracteristici în NTFS: toleranță îmbunătățită la erori, emularea altor sisteme de fișiere, un model de securitate puternic, procesarea paralelă a fluxurilor de date, crearea de atribute de fișiere definite de utilizator;
- Suport standard POSIX. Caracteristicile de bază includ nume de fișiere opționale care țin cont de majuscule, stocarea orei la care a fost accesat ultima dată un fișier și un mecanism de nume alternativ care permite ca același fișier să fie referit prin mai multe nume;
- flexibilitate. Alocarea spațiului pe disc este foarte flexibilă: dimensiunea clusterului poate varia de la 512 octeți la 64 KB.
NTFS funcționează bine cu seturi mari de date și volume mari. Dimensiunea maximă a volumului (și fișierului) este de 16 EB. (1 EB este egal cu 2**64 sau 16000 de miliarde de gigaocteți.) Numărul de fișiere din directoarele rădăcină și non-rădăcină nu este limitat. Deoarece structura de directoare NTFS se bazează pe o structură de date eficientă numită „arbore binar”, timpul de căutare a fișierelor în NTFS nu este legat liniar de numărul de fișiere.
NTFS are unele capacități de auto-vindecare și acceptă diferite mecanisme de verificare a integrității sistemului, inclusiv înregistrarea tranzacțiilor, care vă permite să urmăriți operațiunile de scriere a fișierelor în jurnalul de sistem.
Sistemul de fișiere NTFS acceptă modelul de obiecte de securitate și tratează toate volumele, directoarele și fișierele ca obiecte NTFS independente. Drepturile de acces la volume, directoare și fișiere depind de contul de utilizator și de grupul căruia îi aparține utilizatorul.
Sistemul de fișiere NTFS are capabilități de compresie încorporate care pot fi aplicate volumelor, directoarelor și fișierelor.

Sistem de fișiere Ext3.
Sistemul de fișiere ext3 poate suporta fișiere de până la 1 TB. Cu nucleul Linux 2.4, dimensiunea sistemului de fișiere este limitată de dimensiunea maximă a dispozitivului bloc, care este de 2 teraocteți. În Linux 2.6 (pentru procesoare pe 32 de biți), dimensiunea maximă a dispozitivului bloc este de 16 TB, totuși ext3 acceptă doar până la 4 TB.
Ext3 are o bună compatibilitate cu NFS și nu are probleme de performanță atunci când există o lipsă de spațiu liber pe disc Un alt avantaj al ext3 vine din faptul că se bazează pe codul ext2. Formatul de disc al ext2 și ext3 este identic; De aici rezultă că, dacă este necesar, sistemul de fișiere ext3 poate fi montat ca ext2 fără probleme. Și asta nu este tot. Datorită faptului că ext2 și ext3 folosesc metadate identice, este posibilă actualizarea ext2 la ext3 din mers.
Fiabilitate Ext3
Pe lângă compatibilitatea cu ext2, ext3 moștenește și alte avantaje ale formatului comun de metadate. Utilizatorii ext3 au la dispoziție instrumentul fsck care a fost dovedit de ani de zile. Desigur, principalul motiv pentru trecerea la un sistem de fișiere de jurnal este acela de a elimina necesitatea verificărilor periodice și îndelungate ale consistenței metadatelor de pe disc. Cu toate acestea, „înregistrarea” nu protejează împotriva blocărilor nucleului sau a deteriorării discului (sau orice altceva de genul acesta). În caz de urgență, veți aprecia faptul că ext3 are continuitate de la ext2 cu fsck-ul său.
Jurnal în ext3.
Acum că avem o înțelegere generală a problemei, să ne uităm la modul în care ext3 face jurnalizarea. Codul de înregistrare ext3 folosește un API special numit stratul Journaling Block Device sau JBD. JBD a fost proiectat pentru autentificare pe orice dispozitiv bloc. Ext3 este legat de API-ul JBD. În acest caz, codul sistemului de fișiere ext3 informează JBD-ul despre necesitatea modificării și solicită permisiunea JBD-ului pentru a o efectua. Jurnalul este gestionat de JBD în numele driverului sistemului de fișiere ext3. Această convenție este foarte convenabilă, deoarece JBD este dezvoltat ca un obiect separat, universal și poate fi folosit în viitor pentru jurnalizare în alte sisteme de fișiere.
Protecția datelor în Ext3
Acum putem vorbi despre modul în care sistemul de fișiere ext3 oferă înregistrare atât pentru date, cât și pentru metadate. Există de fapt două metode pentru a garanta consistența în ext3.
ext3 a fost conceput inițial pentru înregistrarea datelor și a metadatelor complete. În acest mod (numit modul „date=jurnal”), JBD înregistrează toate modificările aduse sistemului de fișiere, legate atât de date, cât și de metadate. În acest caz, JBD poate folosi jurnalul pentru a derula înapoi și a restaura metadatele și datele. Dezavantajul înregistrării „complete” este performanța sa destul de scăzută și consumul unei cantități mari de spațiu pe disc pentru jurnal.
Recent, la ext3 a fost adăugat un nou mod de jurnalizare care combină performanța ridicată cu garanția consistenței structurii sistemului de fișiere după o blocare (cum ar fi sistemele de fișiere jurnalizate „obișnuite”). Noul mod de operare servește doar metadate. Cu toate acestea, driverul sistemului de fișiere ext3 urmărește în continuare procesarea blocurilor întregi de date (dacă acestea implică modificarea metadatelor) și le grupează într-un obiect separat numit tranzacție. Tranzacția va fi finalizată numai după ce toate datele au fost scrise pe disc. Un efect secundar al acestei tehnici brute (numită modul „date=ordonate”) este că ext3 oferă o probabilitate mai mare de integritate a datelor (comparativ cu sistemele de fișiere de jurnal „avansate”), garantând în același timp consistența metadatelor. În acest caz, sunt înregistrate numai modificările aduse structurii sistemului de fișiere. Ext3 utilizează acest mod în mod implicit.
Ext3 are multe avantaje. Este proiectat pentru o ușurință maximă de desfășurare. Se bazează pe ani de cod ext2 dovedit și a moștenit minunatul instrument fsck. Ext3 este destinat în primul rând aplicațiilor care nu au capabilități încorporate pentru a garanta integritatea datelor. În general, ext3 este un sistem de fișiere minunat și o continuare demnă a ext2. Există încă o caracteristică care distinge pozitiv ext3 de alte sisteme de fișiere jurnalizate sub Linux - fiabilitate ridicată.

Sistemul de fișiere ext4 este o continuare evolutivă demnă a sistemului ext.

Bună ziua, dragă utilizator, în acest articol vom vorbi despre un subiect precum fișierele. Și anume, ne vom uita la: Gestionarea fișierelor, tipuri de fisiere, structura fișierului, atributele fișierului.

Sistemul de fișiere

Una dintre sarcinile principale ale sistemului de operare este de a oferi confort utilizatorului atunci când lucrează cu date stocate pe discuri. Pentru a face acest lucru, sistemul de operare înlocuiește structura fizică a datelor stocate cu un model logic ușor de utilizat, care este implementat sub forma unui arbore de directoare afișat pe ecran de utilități precum Norton Commander, Far Manager sau Windows Explorer. Elementul de bază al acestui model este fişier, care este la fel ca Sistemul de fișiereîn general, poate fi caracterizat atât prin structură logică cât și fizică.

Gestionarea fișierelor

Fişier– o zonă denumită a memoriei externe destinată citirii și scrierii datelor.

Fișierele sunt stocate în memorie independentă de energie. O excepție este un disc electronic, atunci când o structură care imită un sistem de fișiere este creată în OP.

Sistemul de fișiere(FS) este o componentă a sistemului de operare care asigură organizarea pentru crearea, stocarea și accesul la seturi de date numite - fișiere.

Sistemul de fișiere include: Sistemul de fișiere include:

  • Colecția tuturor fișierelor de pe disc.
  • Seturi de structuri de date utilizate pentru gestionarea fișierelor (directoare de fișiere, descriptori de fișiere, tabele de alocare a spațiului liber și folosit).
  • Un set de instrumente software de sistem care implementează diverse operații asupra fișierelor: crearea, distrugerea, citirea, scrierea, denumirea, căutarea.

Problemele rezolvate de FS depind de modul în care procesul de calcul este organizat în ansamblu. Cel mai simplu tip este un sistem de fișiere în sistemele de operare cu un singur utilizator și cu un singur program. Principalele funcții dintr-un astfel de FS au ca scop rezolvarea următoarelor sarcini:

  • Denumirea fișierelor.
  • Interfață software pentru aplicații.
  • Maparea modelului de sistem de fișiere logic pe organizarea fizică a depozitului de date.
  • Rezistență FS la întreruperi de curent, erori hardware și software.

Sarcinile FS devin mai complicate în sistemele de operare multitasking cu un singur utilizator, care sunt concepute pentru munca unui singur utilizator, dar fac posibilă rularea mai multor procese simultan. La sarcinile enumerate mai sus, se adaugă o nouă sarcină - acces partajat la un fișier din mai multe procese.

În acest caz, fișierul este o resursă partajată, ceea ce înseamnă că FS trebuie să rezolve întreaga gamă de probleme asociate cu astfel de resurse. În special: trebuie să existe mijloace pentru blocarea unui fișier și a părților sale, reconcilierea copiilor, prevenirea curselor și eliminarea blocajelor. În sistemele cu mai mulți utilizatori, apare o altă sarcină: Protejarea fișierelor unui utilizator împotriva accesului neautorizat de către alt utilizator.

Funcțiile FS, care funcționează ca parte a unui sistem de operare de rețea, devin și mai complexe de care are nevoie pentru a organiza protecția fișiere un utilizator de la accesul neautorizat al altui utilizator.

Scop principal Sistemul de fișiereși corespunzătoare acestuia sisteme de gestionare a fișierelor– organizarea unei gestionări convenabile a fișierelor organizate ca fișiere: în loc de acces la nivel scăzut la date care indică adresele fizice specifice ale înregistrării de care avem nevoie, se folosește accesul logic indicând numele fișierului și înregistrarea din acesta.

Trebuie să se distingă termenii „sistem de fișiere” și „sistem de gestionare a fișierelor”: sistemul de fișiere determină, în primul rând, principiile accesului la datele organizate ca fișiere. Iar termenul „sistem de gestionare a fișierelor” ar trebui folosit în legătură cu o implementare specifică a sistemului de fișiere, de exemplu. Acesta este un set de module software care asigură lucrul cu fișiere într-un anumit sistem de operare.

Exemplu

Sistemul de fișiere FAT (tabel de alocare a fișierelor) are multe implementări ca sistem de gestionare a fișierelor

  • Sistemul dezvoltat pentru primele PC-uri se numea simplu FAT (acum numit simplu FAT-12). A fost proiectat să funcționeze cu dischete și de ceva timp a fost folosit pentru a funcționa cu hard disk-uri.
  • Apoi a fost îmbunătățit pentru a funcționa cu hard disk-uri mai mari, iar această nouă implementare a fost numită FAT-16. acest nume este folosit și în relație cu SUF-ul MS-DOS în sine.
  • Implementarea SUF pentru OS/2 se numește super-FAT (diferența principală este capacitatea de a accepta atribute extinse pentru fiecare fișier).
  • Există o versiune de SUF pentru Windows 9x/NT etc. (FAT-32).

Tipuri de fisiere

Fișiere obișnuite: conțin informații de natură arbitrară care sunt introduse în ele de către utilizator sau care sunt generate ca urmare a funcționării sistemului și a programelor utilizatorului. Conținutul unui fișier obișnuit este determinat de aplicația care funcționează cu acesta.

Fișierele obișnuite pot fi de două tipuri:

  1. Software(executable) – sunt programe scrise în limbajul de comandă al sistemului de operare și îndeplinesc unele funcții de sistem (au extensii .exe, .com, .bat).
  2. Fișiere de date– toate celelalte tipuri de fișiere: documente text și grafice, foi de calcul, baze de date etc.

Cataloage- acesta este, pe de o parte, un grup de fișiere combinate de utilizator pe baza anumitor considerații (de exemplu, fișiere care conțin programe de joc sau fișiere care alcătuiesc un pachet de software), iar pe de altă parte, acesta este un tip de fișiere care conțin informații de ajutor de sistem despre un set de fișiere grupate de utilizatori după niște criterii informale (tipul fișierului, locația pe disc, drepturi de acces, data creării și modificării).

Fișiere speciale– acestea sunt fișiere fictive asociate dispozitivelor de intrare/ieșire, care sunt folosite pentru a unifica mecanismul de accesare a fișierelor și dispozitivelor externe. Fișierele speciale permit utilizatorului să efectueze operațiuni I/O utilizând comenzi normale de scriere sau citire a fișierelor. Aceste comenzi sunt procesate mai întâi de programele FS, iar apoi la o anumită etapă de execuție a cererii sunt convertite de sistemul de operare în comenzi de control pentru dispozitivul corespunzător (PRN, LPT1 - pentru portul imprimantei (nume simbolice, pentru OS - acestea sunt fișiere). ), CON - pentru tastatură).

Exemplu. Copiați con text1 (lucrați cu tastatura).

Structura fișierului

Structura fișierului– întregul set de fișiere de pe disc și relațiile dintre ele (ordinea în care fișierele sunt stocate pe disc).

Tipuri de structuri de fișiere:

  • simplu, sau cu un singur nivel: Un director este o secvență liniară de fișiere.
  • ierarhic sau pe mai multe niveluri: Un director în sine poate face parte dintr-un alt director și poate conține multe fișiere și subdirectoare în el. Structura ierarhică poate fi de două tipuri: „Arborele” și „Rețea”. Directoarele formează un „Arbore” dacă fișierul poate fi inclus într-un singur director (OS MS-DOS, Windows) și „Rețea” - dacă fișierul poate fi inclus în mai multe directoare simultan (UNIX).
  • Structura fișierului poate fi reprezentată ca un grafic care descrie ierarhia directoarelor și fișierelor:



Tipuri de nume de fișiere

Fișierele sunt identificate prin nume. Utilizatorii dau fișiere nume simbolice, aceasta ține cont de restricțiile sistemului de operare atât pentru caracterele utilizate, cât și pentru lungimea numelui. În primele sisteme de fișiere, aceste limite erau destul de înguste. Deci în popular Sistem de fișiere FAT Lungimea numelor este limitată de binecunoscuta schemă 8.3 (8 caractere - numele în sine, 3 caractere - extensia numelui), iar în UNIX System V numele nu poate conține mai mult de 14 caractere.

Cu toate acestea, este mult mai convenabil pentru utilizator să lucreze cu nume lungi, deoarece acestea vă permit să acordați fișierului un nume cu adevărat mnemonic, prin care, chiar și după o perioadă destul de lungă de timp, vă puteți aminti ce conține acest fișier. Prin urmare, sistemele de fișiere moderne tind să accepte nume lungi de fișiere simbolice.

De exemplu, Windows NT specifică în sistemul său de fișiere NTFS că un nume de fișier poate avea până la 255 de caractere, fără a lua în considerare caracterul nul final.

Trecerea la nume lungi creează o problemă de compatibilitate cu aplicațiile create anterior care folosesc nume scurte. Pentru ca aplicațiile să acceseze fișiere conform convențiilor acceptate anterior, sistemul de fișiere trebuie să fie capabil să furnizeze nume scurte (alias-uri) echivalente fișierelor care au nume lungi. Astfel, una dintre sarcinile importante devine problema generării unor nume scurte adecvate.

Numele simbolice pot fi de trei tipuri: simple, compuse și relative:

  1. Nume simplu identifică un fișier într-un singur director, atribuit fișierelor ținând cont de nomenclatura simbolului și lungimea numelui.
  2. Numele complet este un lanț de nume simbolice simple ale tuturor directoarelor prin care trece calea de la rădăcină la un anumit fișier, nume de disc, nume de fișier. Deci numele complet este compozit, în care numele simple sunt separate între ele printr-un separator acceptat în sistemul de operare.
  3. Dosarul poate fi de asemenea identificat nume relativ. Numele relativ al fișierului este determinat prin conceptul de „director curent”. În orice moment, unul dintre directoare este curent, iar acest director este selectat de către utilizator însuși la comanda sistemului de operare. Sistemul de fișiere captează numele directorului curent, astfel încât să îl poată utiliza apoi ca o completare a numelor relative pentru a forma numele de fișier complet calificat.

Într-o structură de fișiere de tip arbore, există o corespondență unu-la-unu între un fișier și numele complet - „un fișier - un nume complet”. Într-o structură de fișiere de rețea, un fișier poate fi inclus în mai multe directoare, ceea ce înseamnă că poate avea mai multe nume complete; Corespondența aici este „un fișier - multe nume complete”.

Pentru fișierul 2.doc, definiți toate cele trei tipuri de nume, cu condiția ca directorul curent să fie directorul 2008_year.

  • Nume simplu: 2.doc
  • Nume complet: C:\2008_year\Documents\2.doc
  • Nume relativ: Documents\2.doc

Atributele fișierului

O caracteristică importantă a unui fișier sunt atributele acestuia. Atribute– acestea sunt informații care descriu proprietățile fișierelor. Exemple de atribute posibile de fișier:

  • Atribut numai citire;
  • Semnează „fișier ascuns” (Hidden);
  • Semnează „fișier de sistem” (Sistem);
  • Semnează „fișier de arhivă” (Arhivă);
  • Tipul fișierului (fișier obișnuit, director, fișier special);
  • Proprietarul dosarului;
  • Creator de fișiere;
  • Parola pentru accesarea fișierului;
  • Informații despre operațiunile permise de acces la fișiere;
  • Momentul creării, ultimul acces și ultima modificare;
  • Dimensiunea curentă a fișierului;
  • Dimensiunea maximă a fișierului;
  • Semnează „temporar (elimină după finalizarea procesului)”;
  • Semn de blocare.

În diferite tipuri de sisteme de fișiere, se pot utiliza diferite seturi de atribute pentru a caracteriza fișierele (de exemplu, într-un sistem de operare cu un singur utilizator, setul de atribute nu va conține caracteristici legate de utilizator și securitate (creatorul fișierului, parola pentru accesarea fișierului etc.).

Utilizatorul poate accesa atribute folosind facilitățile oferite în acest scop de sistemul de fișiere. De obicei, puteți citi valorile oricăror atribute, dar modificați doar unele, de exemplu, puteți modifica drepturile de acces ale unui fișier, dar nu puteți modifica data creării sau dimensiunea curentă a fișierului.

Permisiuni pentru fișiere

Definirea drepturilor de acces la un fișier înseamnă definirea pentru fiecare utilizator a unui set de operații pe care le poate aplica unui anumit fișier. Diferite sisteme de fișiere pot avea propria listă de operațiuni de acces diferențiate. Această listă poate include următoarele operațiuni:

  • crearea de fișiere.
  • distrugerea fișierului.
  • scrierea într-un fișier.
  • deschiderea unui dosar.
  • închiderea dosarului.
  • citind din fisier.
  • adăugare de fișiere.
  • cauta in fisier.
  • obținerea atributelor fișierului.
  • stabilirea de noi valori de atribut.
  • redenumire.
  • execuția fișierului.
  • citirea unui catalog etc.

În cazul cel mai general drepturi de acces poate fi descris printr-o matrice de drepturi de acces, în care coloanele corespund tuturor fișierelor din sistem, rândurile corespund tuturor utilizatorilor, iar la intersecția rândurilor și coloanelor sunt indicate operațiunile permise:

În unele sisteme, utilizatorii pot fi împărțiți în categorii separate. Pentru toți utilizatorii din aceeași categorie, sunt definite drepturi de acces uniforme, de exemplu, în sistemul UNIX, toți utilizatorii sunt împărțiți în trei categorii: proprietarul fișierului, membrii grupului său și toți ceilalți.