前段时间又忙着投各种简历,面试,结果纷纷悲剧。只能当时锻炼胆量和总结经验了,结果也发现了自己很多不足,决定闭关一阵子好好巩固巩固再说。
Lab2 实在是没怎么认真做,基本都是参考上一些学长学姐做过的东西。也留下了很多BUG没有解决,所以也不敢放上来都。
Lab3 过几天又要交了,这今天又有的忙活了,这两天会写一些实验中的过程方出来,仅供参考,当然我也都是参考别人的做的。
攒人品,求过~
1. 首先,为FileHeader添加属性,一级索引和二级索引,同时减小NumDirect的大小。
int inDirectSector1; // 一级索引
int inDirectSector2; // 二级索引
2. 修改FileHeader::Allocate(BitMap *freeMap, int fileSize)方法。
在这里只做了一级索引的方法,二级索引的方法类似。
bool FileHeader::Allocate(BitMap *freeMap, int fileSize)
{
numBytes = fileSize; //文件大小
numSectors = divRoundUp(fileSize, SectorSize); //根据文件大小计算所需块数
if(NumDirect >= numSectors) //如果直接索引的数据块足够
{
if (freeMap->NumClear() < numSectors) //如果位图中空间块不足
return FALSE; // not enough space
for (int i = 0; i < numSectors; i++) //找到一个空间块并分配
dataSectors[i] = freeMap->Find();
}
else //如果直接索引的数据块不够
{
if(freeMap->NumClear() < numSectors +1) return FALSE; //多一块用来存索引
for (int i = 0; i< NumDirect; i++)
dataSectors[i] = freeMap->Find();
inDirectSector1 = freeMap->Find(); //分配一块用来存索引
int index[numSectors-NumDirect];
for (int i = 0; i< numSectors - NumDirect;i++)
{
index[i] = freeMap->Find();
}
synchDisk->WriteSector(inDirectSector1,(char *)index);
}
return TRUE;
}
3. 修改ByteToSector 方法。
int FileHeader::ByteToSector(int offset)
{
int sector = offset / SectorSize;
if( sector < NumDirect) //如果只用到了直接索引
return (dataSectors[sector]);
else
{ //如果还用到了一级索引
sector -=NumDirect;
int index[numSectors - NumDirect];
synchDisk->ReadSector(inDirectSector1,(char *)index);
return (index[sector]);
}
}
4. 删除文件时也需要判断,如果用到了一级索引,还需要将一级索引中的块号释放掉。
5. 修改Print方法。当文件用到了一级索引时,需要先读取存储间接索引的块内容,然后打开一级索中用到的块,读取块内容。
实验结果如下,可以看到直接索引指向的块号为7-31。一级索引所保存的块号为33-55。