[ 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; } |