|
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.
- 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))
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:
Offset
(byte)
Marime
(Bytes)
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.
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.