Documente noi - cercetari, esee, comentariu, compunere, document
Documente categorii

Caracteristici ale sistemului de fisiere fat

CARACTERISTICI ALE SISTEMULUI DE FISIERE FAT



1 Structura unui director in FAT(FAT Directory Structure )


Structura unui director in FAT (tabela de alocare a fisierelor) nu este altceva decat un "fisier" format dintr-o lista de 32 octeti. Singurul director care trebuie sa fie tot timpul prezent este directorul radacina. Pentru FAT 12 si FAT 16 acest director se afla pe o pozitie bine stabilita imediat dupa FAT. Pentru FAT 32 acesta poate sa aiba o marime o marime variabila si se poate afla oriunde pe disc.


Structura intrarii de directoare FAT 32



Nume

Offset (byte)

Marimea

(bytes)

Descrierea

DIR_Name

0

11

Numele scurt.

DIR_Attr

11

1

Atributele fisierului:

ATTR_READ_ONLY  0X01

ATTR_HIDDEN 0X02

ATTR_SYSTEM 0X04

ATTR_VOLUME_ID0X08

ATTR_DIRECTORY 0X10

ATTR_ARCHIVE0X20

ATTR_LUNG_NAME ATTR_READ_ONLY|

ATTR_HIDDEN|

ATTR_SYSTEM|

ATTR_VOLUME_ID|

Primii doi biti din octetii atributului sunt rezervati

Trebuie intotdeauna setati 0 cand fisierul este creat si niciodata modificati sau verificata dupa aceea.

DIR_NTRes

12

1

Rezervat pentru a fi folosit de Windows NT. Trebuie intotdeauna setat 0 cand fisierul este creat si niciodata modificati sau verificata dupa aceea.

DIR_CrtTimeTenth

113

1

Milisecundele timpului de creare. Acest camp contine de fapt un numar al zecimilor de secunda si el poate lua o valoare intre 0 si 199 inclusi

DIR_CrtTime

14

2

Timpul la care a fost creat fisierul.

DIR_CrtDate

16

2

Data la care a fost creat fisierul

DIR_LstAccDate

18

2

Data ultimului acces. Nu este timpul ultimului acces, ci doar data. Aceasta este de fapt data ultimei citiri sau scrieri. Daca este scriere, aceasta data trebuie sa aceeasi cu DIR_WrtDate.

DIR_FstClusHi

20

2

Indica daca cuvantul este lung sau scurt. (este 0 pentru volumul FAT 12 sau FAT 16).

DIR_WrtTime

22

2

Timpul ultimei scrieri. Timpul de creare al fisierului este considerat un timp de scriere.

DIR_WrtDate



24

2

Data ultimei scrieri. Crearea fisierului este considerat data de scriere.

DIR_FstClusLO

26

2

Low word of this entry's first clusters number.

DIR_FileSize

28

4

32 biti care retin dimensiunea in octeti a fisierului.



DIR_name[0]

Daca DIR_Name[0]==0xE5, atunci acest director nu exista. (nu exista nici o intrare de fisier sau director)

Daca DIR_Name[0]==0x00, intrarea de director este libera (la fel ca 0xE5), si nu este alocata nici o intrare dupa aceasta (toti bytes DIR_Name[0] din toate intrarile dupa acesta sunt setate cu valoarea 0)

Daca DIR_Name[0]==0x05, atunci caracterul numelui de fisier pentru acest octet este 0xE5. 0xE5 este un octet valid pentru caractere folosite in Japonia. Caracterul special 0x05 este folosit pentru a permite Japoniei folosirea caracterului 0xE5.

Campul nume are doua parti: 8 caractere pentru nume si 3 pentru extensie. DIR_Name[0] nu poate fi egal cu 0x20 care este implicit caracterul "." folosit pentru a desparti partea principala a numelui de extensia care nu este prezenta la directoare. Caracterele mici nu sunt permise in campul DIR_Name.

Urmatoarele caractere nu sunt permise in campul DIR_Name:

Valori mai mici de 0x20 cu exceptia 0x05 descrisa mai sus

0x22, 0x2A, 0x2B, 0x2C, 0x2E, 0x2F, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x5B, 0x5Cc, 0x5D si 0x7Cc


In FAT toate numele de directoare sunt unice.

DIR_Attr specifica atributul fisierului sau directorului:

- ATTR_READ_ONLY Indica faptul ca scrierea lui va da gres.

- ATTR_HIDDEN                         La o listare normala nu va fi afisat.

- ATTR_SYSTEM                         Apartine sistemului de operare.

- ATTR_VOLUME_ID    Este eticheta de volum care trebuie sa fie unica.

- ATTR _DIRECTORY     Indica faptul ca acesta este director.

- ATTR_ARCHIVE                               Acesta suporta facilitatea de backup. Acest bit este setat de FAT cand un fisier este creat, redenumit sau modificat. Aceasta facilitate de backup este folosita pentru a vedea care fisiere au suferit modificari.

- ATTR_LUNG_NAME                      Indica faptul ca acest "fisier" face parte dintr-un fisier cu nume lung.



Cand este creat un director se seteaza campul ATT_DIRECTORY si campul DIR_FileSize ia valoarea 0. Daca directorul creat nu este directorul radacina este nevoie sa se creeze doua intrari speciale (".","..")

Prima intrare DIR_Name este:      ״ . ״ - directorul curent

A doua intrare DIR_Name este:    ״ .. ״ - directorul parinte


Formatul datei si al timpului(Date and Time Formats)


Formatul datei

Biti 0-4: Ziua (valori intre 1-31 inclusiv).

Biti 5-8: Luna anului(1-12 inclusiv).

Biti 9-15: Numarul de ani trecuti din 1980 (valori intre 0-127 inclusiv (1980 - 2107))

Formatul timpului

Biti 0-4: 2-secunde numarate (intre 0-29 inclusiv (0 - 58 secunde))

Biti 5-10:Minute (0-59 inclusiv).

Biti 11-15: Ore (0-23 inclusiv)

Timpul valid este de la miezul noptii 00:00:00 pana la 23:59:58


2 Intrarile de directoare cu nume lungi in FAT


Intrarea de directoare pentru nume lungi este definita ca o intrarea de directoare pentru nume scurte dar cu niste atribute speciale.

ATTR_LUNG_NAME           ATTR_READ_ONLY|

ATTR_HIDDEN|

ATTR_SYSTEM|

ATTR_VOLUME_ID

Trebuie definita o masca pentru a ne da seama daca este sau nu un director cu nume lung.

ATTR_LUNG_NAME_MASK ATTR_READ_ONLY|

ATTR_HIDDEN|

ATTR_SYSTEM|

ATTR_VOLUME_ID|

ATTR_DIRECTORY|

ATTR_ARCHIVE

Cand o astfel de intrare este intalnita ea este tratata in mod special de sistem. Fiecare intrare de director sau fisier cu nume lung este structurata astfel:

Structura intrarii FAT de directoare cu nume lungi

Name

Offset

(byte)

Marime

(Bytes)

Descriere

LDIR_Ord

0

1

Numarul de ordine al acestei intrari in secventa de intrari asociate cu o intrare scurta, fata de sfarsitul secventei.

Daca are masca 0x40 (LAST_LONG_ENTRY), indica faptul ca aceasta intrare este ultima din setul de intrari de directoare cu nume lungi. Toate seturile de intrari de nume lungi valide trebuie sa contina o intrare care sa aiba aceasta masca.

LDIR_Name1



1

10

Caracterele 1-5 din numele lung, subcomponente in aceasta intrare de director.

LDIR_Attr

11

1

Atribut - trebuie sa fie ATTR_LONG_NAME

LDIR_Type

12

1

Daca este 0, indica o intrare de director care este subcomponenta a unui nume lung.

NOTA: Alta valoare rezervata pentru viitoare extinderi.

Non-zero implica alte tipuri diferite..

LDIR_Chksum

13

1

Checksumul numelui din intrarea numelui scurt.

LDIR_Name2

14

12

Caracterele 6-11 din numele lung, subcomponente in aceasta intrare de director.

LDIR_FstClusLO

26

2

Trebuie sa fie ZERO pentru compatibilitate cu utilitarele de disc. Este fara sens pentru intrarea de director cu nume lung.

LDIR_Name3

28

4

Caracterele 6-11 din numele lung, subcomponente in aceasta intrare de director.


Organizarea si asocierea numelor scurte cu numele lungi din FAT


Un set de intrari cu nume lung este intotdeauna asociata cu o intrare cu nume scurt pe care o preceda. Aceasta asociere este folosita pentru compatibilitatea cu vechile sisteme de operare MS-DOS sau Windows. Fara o intrare cu nume scurt directorul sau fisierul ar fi complet invizibil pentru versiunile anterioare de MS-DOS, Windows. O intrare de nume lung niciodata nu exista singura.

Intrarile cu nume lung intotdeauna preced pe cea cu nume scurt si se afla fizic in continuarea acesteia. Sistemul face cateva verificari pentru a se asigura ca exista intrari de nume lungi asociate cu o intrare cu nume scurt.


Secventa de intrari de directoare cu nume lungi

Intrare

Ordinal

Numarul intrarii lungi

LAST_LUNG_ENTRY(0X40) | N

.Intrare lunga aditionala


Prima intrare lunga

1

Intrare scurta asociata cu precedenta

(not applicable)


La inceput, fiecare membru din setul de intrari cu nume lung este numerotat cu un nume unic si ultimul membru este marcat cu un steag care indica faptul ca este ultimul membru din set. Campul LDIR_Ord este folosit pentru a face aceasta diferenta. Primul membru din set are valoarea campului LDIR_Ord unu. Ultimul are valoarea n sau LAST_LONG_ENTRY. Campul LDIR_Ord nu poate avea valoarea 0xE5 sau 0x00 acestea indicand o intrare vida(libera) de director sau ultima valoare a directorului intr-un cluster. Singurele valori valide sunt intre 1 si n.

Cu numele scurt este calculat un checksum. Aceasta valoare este pusa in fiecare intrare de nume lung. Daca acestea nu corespund atunci fisierul sau directorul este tratat ca orfan, si nu mai este valid. Acest lucru se poate intampla cand se redenumeste fisierul din versiuni anterioare de DOS sau Windows.

Un algoritm implementat in C pentru calcularea checksum-ului:


- ChkSum()- returneaza checksumul calculat

- Parametrul pFcbName este un pointer la un unsigned byte array de 11 bytes lungime. Array contine numele scurt.

- Returneaza Sum un 8-bit unsigned checksum referit de pointerul pFcbName


unsigned char ChkSum(unsigned char pFcbName)


Intrarile de nume lungi pot sa contina si alte informatii si nu este nevoie sa copieze informatiile disponibile in numele scurt.

Stocarea unui nume lung


Un nume lung poate consta din mai multe caractere care nu pot fi memorate intr-o singura intrare de nume. De aceea se folosesc mai multe intrari. Urmatorul exemplu arata cum un nume lung este stocat de-a lungul catorva intrari. Numele sunt de asemenea terminate cu NULL sau inzestrate cu valoarea 0xFFFF.



Presupunem ca am creat fisierul cu numele "The quick brown.fox". Urmatorul exemplu ilustreaza cum este stocat:


3. Limite de nume si seturi de caractere


Intrari de nume scurt


Numele scurte sunt limitate la 8 caractere urmate optional de "." si o extensie de 3 caractere. Lungimea totala a caii de acces nu poate depasi 80 de caractere incluzand si NULL (64 caractere calea +3 caractere driverul + 12 numele + NULL).

Caracterele pot fi orice combinatii de litere, cifre sau simboluri cu codul peste 127. Urmatoarele caractere sunt de asemenea permise: - _ ' ! () ^ # &

Numele scurte sunt intotdeauna convertite cu litere mari.


Intrarile de nume lung


Numele lungi sunt limitate la 255 de caractere, fara NULL. Lungimea totala a caii nu poate depasi 260 de caractere incluzand si NULL. Caracterele folosite sunt aceleasi ca cele pentru nume scurte la care se mai adauga caracterul " . " si spatiul. Urmatoarele caractere nu sunt acceptate in numele lungi: + , ; = [ ]

Caracterul spatiu pus la inceput sau la sfarsit de nume este ignorat. Parantezele de la sfarsit vor fi ignorate.

Numele lungi sunt memorate in Unicode care ocupa 16 biti nu 8 ca ASCII. Caracterele unui nume lung nu sunt transformate in caractere mari pastrandu-i unicitatea.


Potrivirea de nume


Numele aflate in intrarile de directoare cu nume scurte sunt numite "short name space", iar numele lungi aflate in intrarile cu nume lungi sunt numite "long name space". Impreuna ele formeaza un unic spatiu de nume in care nu se poate gasi nici un duplicat. Desi literele mici si mari sunt in fiecare fisier cu nume lung, nu pot exista doua la fel cu acelasi nume daca ignoram felul de scriere.


4. Conventii de nume


Pentru a nu face confuzie intre mai multe fisiere care au acelasi nume scurt atunci cand nu se poate citi numele lung al lor, se genereaza automat la sfarsitul acestuia un numar care face distinctia intre ele.

Algoritmul urmator este un algoritm de generare al numelui scurt dintr-un nume lung.

PAS 1. Numele Unicode trimis sistemului este convertit in litere mari.

PAS 2. Numele in Unicod anterior este convertit la OEM. Daca un caracter nu este acceptat acesta se converteste automat in "

PAS 3.Se elimina spatiile de la inceput si de la sfarsit.

PAS 4. Se elimina toate parantezele de la inceputul numelui lung.

PAS 5. Cat timp nu s-a ajuns la sfarsitul numelui lung, nu sa gasit nici o paranteza si numarul total de caractere este mai mic decat 8, se copiaza caracterele pe pozitia primara din numele de baza.

PAS 6 Se insereaza " . " la sfarsitul componentei primare din numele de baza daca numele de baza are o extensie dupa ultima perioada din nume.

PAS 7Scaneaza pana la ultima parte a numelui lung. Daca a fost gasita si nu s-a ajuns la sfarsitul numelui si sau copiat mai putin de 3 caractere, atunci copiaza caracterele pe pozitia extensiei din numele de baza.

PAS 8 Treci la generarea numarului din coada.


Algoritm de generare a numarului din coada:

Daca (o "lossz conversion"nu a fost semnalata)

si(numele lung incape in conventia de 8.3 caractere )

si(numele de baza nu coincide cu nici un nume scurt existent)


altfel


"~n" variaza intre "~1" si "~999999". Numarul este ales ca fiind urmatorul dintr-o secventa de fisiere cu acelasi nume de baza. De exemplu daca avem fisierele Mydocu~1 si Mydocu~2, urmatorul va avea numele Mydocu~3, iar daca avem Mydocu~1 si Mydocu~3 urmatorul nume va avea Mydocu~2.


5 Efectele numelor lungi asupra versiunilor mai vechi de FAT



Suportul pentru nume lungi este mai important pentru hard discuri, dar este de asemenea suportat si de mediile floppy. Implementarea prevede suport pentru nume lungi fara a sparge compatibilitatea cu formatul FAT existent. Un disc poate fi citit de un sistem de nivel inferior fara probleme de compatibilitate. Un disc existent nu trece printr-un proces de conversie inainte de a incepe folosirea numelor lungi. Toate fisierele curente raman nemodificate. Intrarea de directoare si fisiere cu nume lung este adaugata atunci cand un fisier cu nume lung este creat. Adaugarea unui nume lung la un fisier existent necesita mutarea numelui scurt langa intrari adiacente libere.

Intrarile de nume lungi sunt ascunse la fel cum sunt ascunse si fisierele sistem si fisierele hidden pe un sistem de nivel inferior. Acest lucru este suficient pentru a feri utilizatorul de probleme. Utilizatorul poate sterge si copia fisierelor folosind numele scurt fara a influenta cu ceva numele acestora.

Partea interesata legata de acest lucru se intampla atunci cand discul este adus la un FAT inferior si directorul este schimbat. Aceasta poate afecta intrarile de nume lungi deoarece sistemele de nivel inferior ignora numele lungi si nu face asocierea acestora cu numele scurte.

Un sistem de nivel inferior va vedea intrarile de nume lungi numai atunci cand va fi in cautarea unei etichete. Pe un sistem inferior eticheta de volum va fi incorect raportata daca adevarata eticheta de volum nu se afla inaintea tuturor intrarilor de nume lungi din directorul radacina . Aceasta datorita faptului ca intrarile de nume lungi au bitul pentru eticheta de volum setat. Acesta este un caz nefericit dar nu este o problema critica.

Daca se va face o modificare a etichetei de volum, una dintre intrarile cu nume lung va fi stearsa. Aceasta va fi o intamplare rara si va fi foarte usor detectata de un sistem capabil. Intrarea de nume lung nu va mai fi o intrare valida daca una sau mai multe intrari de nume lungi va fi marcata ca stearsa. Daca intrarea va fi refolosita, octetul de atribut nu va avea intrarea corecta pentru o intrare de nume lung.

Daca un fisier este redenumit pe un sistem de nivel inferior, atunci doar numele scurt va fi redenumit. Numele lung nu va fi afectat. Cum numele scurt si cel lung trebuie sa fie tinute in concordanta de-a lungul numelui de spatiu comun (space name) nu se doreste a se avea numele lung invalid din cauza acestei redenumiri. Checksumul numelui scurt (8.3)care este retinut in intrarea de nume lung ofera posibilitatea de a detecta aceasta schimbare. Acest checksum va fi verificat pentru a valida numele lung inainte de a fi folosit. Redenumirea va cauza probleme daca numele de fisier 8.3 redenumit se intampla sa aiba acelasi checksum. Algoritmul de calcul al checksumului folosit are o distributie uniforma de-a lungul spatiului de nume scurt.

Aceasta redenumire a numelui 8.3 nu trebuie de asemenea sa intre in conflict cu nici unul din numele lungi. Altfel un sistem de nivel inferior poate crea nume scurt de fisier care se potriveste cu numele lung, cand literele mici sau mari sunt ignorate, intr-un fisier diferit. Pentru a preveni aceasta, crearea automata a unui nume scurt 8.3 dintr-un nume lung care are un format 8.3, va mapa direct acest nume lung intr-un format 8.3 convertind caracterele la litere mari.

Daca un nume scurt este sters, atunci numele lung asociat lui va ramane orfan. Daca un nou fisier este creat, numele lung poate fi incorect asociat cu acest nou nume. Ca in cazul unei redenumiri. Checksumul numelui 8.3 va ajuta la prevenirea acestei asocieri incorecte.