[ madona83 @ 19.07.2012. 10:40 ] @
Treba da odradim upis na tekucu poziciju,dvostruko ulancane liste klastera
typedef unsigned long ClusterNo; const unsigned long ClusterSize = 2048;
class Partition {
public:
Partition(char *);
virtual ClusterNo getNumOfClusters() const;
virtual int readCluster(ClusterNo, char *buffer);
virtual int writeCluster(ClusterNo, const char *buffer);
Particija na kojoj je smešten ovakav fajl sistem ima sledeće sekcije:
Početni (nulti) klaster - Na početku klastera nalaze se dva pokazivača širine 32 bita, prvi koji predstavlja broj prvog klastera u listi slobodnih klastera i drugi koji, ukoliko je potrebno, sadrži broj narednog klastera sa ulazima korenog direktorijuma, u suprotnom sadrži vrednost 0; U nastavku ovog klastera nalaze se ulazi korenog direktorijuma;druga je oblast za podatke. svaki fajl se sastoji od dvostruko ulančane liste klastera. Na početku klastera nalaze se dva pokazivača širine 32 bita, prvi koji sadrži broj sledećeg klastera i drugi koji sadrži broj prethodnog klastera sa podacima. Ukoliko neki pokazivač predstavlja kraj liste, u njemu je zapisana vrednost 0 (klaster 0 ne može se pojaviti kao klaster koji sadrži podatke nekog fajla). Takođe, ista ova struktura se koristi i za ulančavanje slobodnih klastera.
Koreni direktorijum na disku zapisuje se na isti način kao fajl, s tim da se u oblasti za podatke nalazi niz ulaza koji opisuju sadržaj direktorijuma. Svaki ulaz u direktorijumu zauzima 20 bajtova. U klaster treba smestiti ceo broj ulaza. Drugim rečima, jedan ulaz nikad se ne smešta jednim delom u jedan klaster i drugim delom u drugi klaster.

Sta nije dobro kod mog upisa na tekuću poziciju u fajl zadatog broja bajtova sa zadate memorijske adrese; Treba da fajl se proširuje upisom na kraj fajla, ukoliko već nije dostignuta maksimalna veličina; po upisu, tekuća pozicija se pomera na kraj upisanog sadržaja; vraća: 0-neuspeh ili 1-uspeh

char KernelFile::write(BytesCnt n, char* buffer)
{
if (endOfFile+n >= 256*2048 + 256*512*2048) return 0;//ako bi fajl presao najvecu dozvoljenu velicinu fajla
if (!allowWriting) return 0; //ne mozemo da upisujemo
if (!fileOpened) return 0;//fajl nije otvoren
int a, b;//a - ulaz u prvi deo klaster, b - ulaz u drugi deo
unsigned long *pok, *pom;
unsigned long counter = 0;
unsigned long pointer;
//najpre citamo tekuci klaster do kraja
if (endOfFile<256*2048)//kraj fajla je u prvoj polovini klastera
{
a = endOfFile/2048;
b = -1;//b<0 to znaci da smo u prvoj polovini

{
pointer = KernelFS::searchFreeCluster(partitionPointer->letter);//trazimo novi klaster
pom = (unsigned long*)(pointerCluster + 256*1024);
*pom = pointer;
}
else
{
pok = (unsigned long*)(pointerCluster + 256*512*1024);
pointer = *pok;
}

} else
{
a = endOfFile - 256*2048;//krecemo od 0 u drugoj polovini indeksnog klastera
a /=(2048*512);//ulaz prvog dela(pocinje od 0)
b = (endOfFile-256*2048)%(512*2048);
b /= 2048;//ulaz u drugom delu klastera

if (z == 0)//novi klaster za podatke
{
pok = KernelFS::searchFreeCluster(partitionPointer->letter);
*pok = pointerCluster;
}//ako klaster za podatke postoji
else pok = *pok;


}

//najpre popunjavamo tekuci klaster
for (z = z;z <2048; z++)
{
pomocniNiz1[z] = buffer[counter];
counter++;
endOfFile++;
if (counter == n)
{
break;
}
}
z = 0;//krece se upis od prve lokacije u klasteru
tekucaPoz = endOfFile; //premestanje tekuce pozicije na kraj
//upis novog sadrzaja

if (counter == n)
{
return 1;
}
//ako ima jos bajtova za upis
bool prva = false;//true znaci da se ulaz nalazi u prvom delu klastera
if (y<0)
{
prva = true;
x++;
if (x>=1024)//x je presao u drugu polovinu klastera
{
prva = false;
x = 0;
y = 0;
}
}
for (z = z;z<2048;z++)
{
pomocniNiz1[z] = buffer[counter];//u niz smesti podatke
counter++;
endOfFile++;
if (counter == n)
{
zavrsi = true;
break;
}
}
z = 0;

if (zavrsi) break;
}

y = 0;
if (zavrsi) break;
}
tekucaPoz = endOfFile;
return 1;
}
[ Nedeljko @ 20.07.2012. 10:58 ] @
Pokušaću sutra da ti odgovorim. Možda prekosutra. Do tada, za pisanje koda postoje [ code ]...[ /code ] tagovi (bez razmaka).